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; }
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, ¤t, 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; }
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; }
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; }
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; }
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, ¤t, 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; }
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, ¤t, 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, ¤t, 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(); }