コード例 #1
0
ファイル: sync.c プロジェクト: asantosh/Programming
void *modifierThread(void *arg)
{
	node_t *x_ptr, *y_ptr;
	while (1) {
		printf("%s\n", __func__);

		WRITE_LOCK(list1Lock);
		x_ptr = listUnLink(&gList_1);
		LEAVE_LOCK(list1Lock);

		WRITE_LOCK(freeListLock);
		y_ptr = listUnLink(&gFreeList);
		LEAVE_LOCK(freeListLock);

		use_block_x_to_pro_y(x_ptr, y_ptr);

		WRITE_LOCK(freeListLock);
		listLink(x_ptr, &gFreeList);
		LEAVE_LOCK(freeListLock);

		WRITE_LOCK(list2Lock);
		listLink(y_ptr, &gList_2);
		LEAVE_LOCK(list2Lock);
	}

	return 0;
}
コード例 #2
0
int lineInsert(LIST *listhead, int x1, int y1, int x2, int y2){
	EDGE *ptr;
	EDGE *prvious;
	EDGE *current;
	EDGE *connect1, *connect2;
	EDGE *line;
	int i;
	int flag = 0;
	int find;

	line = (EDGE*)malloc(sizeof(EDGE));
	ptr = listhead->head;
	prvious = NULL;
	
	for(i = 1; i <= listhead->count; i++){
		if(ptr->p1.x == x1 && ptr->p1.y == y1){
			connect1 = ptr;
			flag = 1;
		}
		if(ptr->p2.x == x2 && ptr->p2.y == y2){
			connect2 = ptr;
		}
		if(ptr->p2.x == x1 && ptr->p2.y == y1){
			connect1 = ptr;
			flag = 2;
		}
		if(ptr->p1.x == x2 && ptr->p1.y == y2){
			connect2 = ptr;
		}
			prvious = ptr;
			ptr = ptr->next;
	}
	if(flag == 1){
		current = listhead->rear;
		listLink(listhead, &current, connect2->p2.x, connect2->p2.y, connect1->p1.x, connect1->p1.y, 3);
		PrintList(listhead);
		return 1;
	}
	else if(flag == 2){
		connect2->next = connect1;
		return 1;
	}
	else return 0;


}
コード例 #3
0
ファイル: sync.c プロジェクト: asantosh/Programming
void *consumerThread(void *arg)
{
	node_t *c_ptr;
	while (1) {
		printf("%s\n", __func__);

		WRITE_LOCK(list2Lock);
		c_ptr = listUnLink(&gList_2);
		LEAVE_LOCK(list2Lock);

		consume_info_in_block(c_ptr);

		WRITE_LOCK(freeListLock);
		listLink(c_ptr, &gFreeList);
		LEAVE_LOCK(freeListLock);
	}

	return 0;
}
コード例 #4
0
ファイル: sync.c プロジェクト: asantosh/Programming
void *producerThread(void *arg)
{
	node_t *n_ptr;

	while (1) {
		printf("%s\n", __func__);

		WRITE_LOCK(freeListLock);
		n_ptr = listUnLink(&gFreeList);
		LEAVE_LOCK(freeListLock);

		produce_info(n_ptr);

		WRITE_LOCK(list1Lock);
		listLink(n_ptr, &gList_1);
		LEAVE_LOCK(list1Lock);
	}

	return 0;
}
コード例 #5
0
PLG * clipping(LIST *listhead, PLG *polygonlist, int minY, int maxY, int minX, int maxX){
	int i;
	int dx, dy;
	double x1, y1, x2, y2, X1, X2, Y;
	int flag1 = 0, flag2 = 0;
	EDGE *pair_ptr1, *pair_preptr1;
	EDGE *pair_ptr2, *pair_preptr2;
	EDGE *preptr;
	EDGE *ptr;
	EDGE *beginptr, *endptr, *deleteptr, *predeleteptr;
	LIST *begin_end_list;
	EDGE *begin_end_current;


	LIST *connectlist1;
	EDGE *connectcurrent1;
	LIST *connectlist2;
	EDGE *connectcurrent2;
	LIST *datalist;
	EDGE *datacurrent;
	

	ptr = listhead->head;
	datalist = NULL;
	connectlist1 = NULL;
	connectcurrent1 = NULL;
	connectlist2 = NULL;
	connectcurrent2 = NULL;

	begin_end_list = NULL;
	begin_end_current = NULL;


	for(i=1; i<= listhead->count; i++){
		if((ptr->p1.y < maxY && ptr->p2.y > maxY) || (ptr->p1.y > maxY && ptr->p2.y < maxY)){
			Y = maxY;
			x1 = (double)(ptr->p1.x);
			y1 = (double)(ptr->p1.y);
			x2 = (double)(ptr->p2.x);
			y2 = (double)(ptr->p2.y);
			X1 = (x2*Y - x1*Y - x2*y1 + x1*y2) / (y2 - y1);
			connectlist1 = listLink(connectlist1, &connectcurrent1, (int)X1, maxY, -1, -1, 3);
			flag1 = 1;
		}
		if((ptr->p1.y < minY && ptr->p2.y > minY) || (ptr->p1.y > minY && ptr->p2.y < minY)){
			Y = minY;
			x1 = (double)(ptr->p1.x);
			y1 = (double)(ptr->p1.y);
			x2 = (double)(ptr->p2.x);
			y2 = (double)(ptr->p2.y);
			X2 = (x2*Y - x1*Y - x2*y1 + x1*y2) / (y2 - y1);
			connectlist2 = listLink(connectlist2, &connectcurrent2, (int)X2, minY, -1, -1, 3);
			flag2 = 1;
		}
			ptr = ptr->next;
			flag1 = 0;
			flag2 = 0;
	}

		printf("before sorting\n");
		PrintList(connectlist1);
		PrintList(connectlist2);
		if(connectlist1)		connectlist1 = sortpoint(connectlist1,'x');
		if(connectlist2)		connectlist2 = sortpoint(connectlist2,'x');
		printf("after sorting\n");
		PrintList(connectlist1);
		PrintList(connectlist2);

		glClear(GL_COLOR_BUFFER_BIT);
		glFlush();


		if(!connectlist1 && !connectlist2){
				polygonlist = polygon_link(polygonlist, listhead, &PLGcurrent);
				Printpolygon(polygonlist);
				glFlush();

				return polygonlist;
		}

		if(connectlist1->count == connectlist2->count){
			pair_preptr1 = connectlist1->head;
			pair_ptr1 = pair_preptr1->next;
			pair_preptr2 = connectlist2->head;
			pair_ptr2 = pair_preptr2->next;
			for(i=2;i <= connectlist1->count; i = i*2){
				datalist = listLink(datalist, &datacurrent, pair_preptr1->p1.x, pair_preptr1->p1.y, pair_preptr2->p1.x, pair_preptr2->p1.y, 1);
				datalist = listLink(datalist, &datacurrent, pair_preptr2->p1.x, pair_preptr2->p1.y, pair_ptr2->p1.x, pair_ptr2->p1.y, 3);
				datalist = listLink(datalist, &datacurrent, pair_ptr2->p1.x, pair_ptr2->p1.y, pair_ptr1->p1.x, pair_ptr1->p1.y, 1);
				datalist = listLink(datalist, &datacurrent, pair_ptr1->p1.x, pair_ptr1->p1.y, pair_preptr1->p1.x, pair_preptr1->p1.y, 3);

				PrintList(datalist);
				polygonlist = polygon_link(polygonlist, datalist, &PLGcurrent);
				Printpolygon(polygonlist);
				glFlush();
				system("pause");
				datalist = NULL;
				datacurrent = NULL;
				if(pair_ptr1->next == NULL)	break;
				pair_preptr1 = pair_ptr1->next;
				pair_ptr1 = pair_ptr1->next->next;
				pair_preptr2 = pair_ptr2->next;
				pair_ptr2 = pair_ptr2->next->next;

			}
}


return polygonlist;
}
コード例 #6
0
int triangulation(LIST *srchead, TRG *trghead){
	int s1, s2, s3;
	POINT *TRGp1, *TRGp2, *TRGp3 ,*TRGtemp;
	EDGE *ptr ;
	EDGE *check_edge_ptr;
	LIST *check_point_list;
	LIST *originallist;
	EDGE *cpptr;


	TRGp1 = NULL;
	TRGp2 = NULL;
	TRGp3 = NULL;
	originallist = (LIST*)malloc(sizeof(LIST));
	memcpy(originallist, srchead, sizeof(srchead));
	check_edge_ptr = (EDGE*)malloc(sizeof(EDGE));
	check_point_list = NULL;
	cpptr = srchead->head;
	
	for(;;){
		check_point_list = listLink(check_point_list, &current, cpptr->p1.x, cpptr->p1.y, cpptr->p2.x, cpptr->p2.y, 1);
		cpptr = cpptr->next;
		if(cpptr == srchead->head)	break;
	}
	ptr = srchead->head;


	while(1){
		if(TRGp1 != NULL){
			while(1){
				TRGp2->x= TRGp3->x;
				TRGp2->y= TRGp3->y;
				ptr = ptr-> next;	
				TRGp3->x= ptr->p1.x;
				TRGp3->y= ptr->p1.y;

				while(check_triangle(TRGp1->x, TRGp1->y, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y, check_point_list) == 0){
					if(srchead->count == 3){
						
						TRGp1->x = srchead->head->p1.x;
						TRGp1->y = srchead->head->p1.y;
						TRGp2->x = srchead->head->next->p1.x;
						TRGp2->y = srchead->head->next->p1.y;
						TRGp3->x = srchead->rear->p1.x;
						TRGp3->y = srchead->rear->p1.y;
						if(check_triangle(TRGp1->x, TRGp1->y, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y, check_point_list) != 0){
							//檢查三角形第一條邊
							check_edge_ptr->p1.x = srchead->head->p1.x;
							check_edge_ptr->p1.y = srchead->head->p1.y;
							check_edge_ptr->p2.x = srchead->head->next->p1.x;
							check_edge_ptr->p2.y = srchead->head->next->p1.y;
							s1 = check_edge_same(check_edge_ptr, srchead);
							//檢查三角形第二條邊
							check_edge_ptr->p1.x = srchead->head->next->p1.x;
							check_edge_ptr->p1.y = srchead->head->next->p1.y;
							check_edge_ptr->p2.x = srchead->rear->p1.x;
							check_edge_ptr->p2.y = srchead->rear->p1.y;
							s2 = check_edge_same(check_edge_ptr, srchead);

							//檢查三角形第三條邊
							check_edge_ptr->p1.x = srchead->rear->p1.x;
							check_edge_ptr->p1.y = srchead->rear->p1.y;
							check_edge_ptr->p2.x = srchead->head->p1.x;
							check_edge_ptr->p2.y = srchead->head->p1.y;
							s3 = check_edge_same(check_edge_ptr, srchead);
							trianglehead = TRGlink(trianglehead, &TRGprvious, &TRGcurrent, TRGp1, TRGp2, TRGp3, s1, s2, s3);
						}
						listDelete(listhead, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y);
						return 0;	
					}
					else if(srchead->count < 3)	return 0;
					else{
						PrintList(srchead);
						TRGp1->x = TRGp2->x;
						TRGp1->y = TRGp2->y;
						TRGp2->x = TRGp3->x;
						TRGp2->y = TRGp3->y;
						ptr = ptr-> next;
						TRGp3->x = ptr->p1.x;
						TRGp3->y = ptr->p1.y;
					}
				}
				break;
			}
		}
		else{
			TRGp1 = (POINT*)malloc(sizeof(POINT));
			TRGp2 = (POINT*)malloc(sizeof(POINT));
			TRGp3 = (POINT*)malloc(sizeof(POINT));
			TRGp1->x = ptr->p1.x;
			TRGp1->y = ptr->p1.y;
			ptr = ptr-> next;
			TRGp2->x = ptr->p1.x;
			TRGp2->y = ptr->p1.y;
			ptr = ptr-> next;
			TRGp3->x = ptr->p1.x;
			TRGp3->y = ptr->p1.y;
			if(srchead->count == 3){
				trianglehead = TRGlink(trianglehead, &TRGprvious, &TRGcurrent, TRGp1, TRGp2, TRGp3, 1, 1, 1);
				listDelete(srchead, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y);
				return 0;
			}
			while(check_triangle(TRGp1->x, TRGp1->y, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y, check_point_list) == 0){
				TRGp1->x = TRGp2->x;
				TRGp1->y = TRGp2->y;
				TRGp2->x = TRGp3->x;
				TRGp2->y = TRGp3->y;
				ptr = ptr-> next;
				TRGp3->x = ptr->p1.x;
				TRGp3->y = ptr->p1.y;
				//找下一個三角形,直到沒有點在此三角形內部為止
			}
		}

		//檢查三角形第一條邊(此邊是外框或內框)
		check_edge_ptr->p1.x = TRGp1->x;
		check_edge_ptr->p1.y = TRGp1->y;
		check_edge_ptr->p2.x = TRGp2->x;
		check_edge_ptr->p2.y = TRGp2->y;
		s1 = check_edge_same(check_edge_ptr, srchead);

		//檢查三角形第二條邊(此邊是外框或內框)
		check_edge_ptr->p1.x = TRGp2->x;
		check_edge_ptr->p1.y = TRGp2->y;
		check_edge_ptr->p2.x = TRGp3->x;	
		check_edge_ptr->p2.y = TRGp3->y;
		s2 = check_edge_same(check_edge_ptr, srchead);

		//檢查三角形第三條邊(此邊是外框或內框)
		check_edge_ptr->p1.x = TRGp3->x;
		check_edge_ptr->p1.y = TRGp3->y;
		check_edge_ptr->p2.x = TRGp1->x;
		check_edge_ptr->p2.y = TRGp1->y;
		s3 = check_edge_same(check_edge_ptr, srchead);
		
		//加入三角形linked-list內
		trianglehead = TRGlink(trianglehead, &TRGprvious, &TRGcurrent, TRGp1, TRGp2, TRGp3, s1, s2, s3);
		listDelete(srchead, TRGp2->x, TRGp2->y, TRGp3->x, TRGp3->y);
		list_link_orphan(srchead);
	}

	free(check_point_list);
	return 1;
}
コード例 #7
0
void mousePtPlot(GLint button, GLint action, GLint xMouse, GLint yMouse){
	EDGE *ptr;
	int j=0;
	PLG *PLGptr;

	if(flag == 9) return;

	//按下左鍵
	if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){
		//第二個點
		if(flag == 1){
			//存入邊
			listhead = listLink(listhead, &current, previousX, previousY, xMouse, winHeight - yMouse, 1);
			counti++;
			//畫出外框
			
			glColor3f(0.0,  1.0,  0.0);
			glBegin(GL_LINES);
				glVertex2i(previousX,  previousY);
				glVertex2i(xMouse,	winHeight - yMouse);
			glEnd();
		}
		//第一個點
		if(flag == 0){
			//紀錄起始點
			startX = xMouse;
			startY = winHeight - yMouse;
			flag = 1;
		}
		//紀錄上一個點

		else if(flag == 4){

			printf("triangle start\n");
			PLGptr = polygonlist;
			
			for(j=1;;j++){
				triangulation(PLGptr->list, trianglehead);
				PLGptr = PLGptr->next;
				if(PLGptr == NULL)	break;
			}
			PrintTRG(trianglehead);
			glFlush();

			printf("triangle finish\n");
			flag = 5;

		}
		else if(flag == 5){
			printf("drawing start\n");
			fillcollor(trianglehead);
			printf("drawing finish\n");
			flag = 9;
		}
		if(flag != 5 || flag != 9){
			previousX = xMouse;
			previousY = winHeight - yMouse;
			plotPoint(xMouse,  winHeight - yMouse);
		}
		if(flag == 3)	flag = 4;
	}
	//按下右鍵
	if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN && doneflag == 0){
		//把最後一個點和起始點連接
		listhead = listLink(listhead, &current, previousX, previousY,startX, startY, 1);
		polygonlist = polygon_link(polygonlist, listhead, &PLGcurrent);
			glColor3f(0.0,  1.0,  0.0);
			glBegin(GL_LINES);
				glVertex2i(previousX,  previousY);
				glVertex2i(startX,	startY);
			glEnd();		
		flag = 4;
		//畫出外框
		glFlush();
		printf("draw contour finish\n");
		doneflag = 1;
	}
	glFlush();
}