/* 判断待求点在哪个圆心范围内 */ int yanxin(double cx, double cy) { struct point u1; struct point u2; struct point v1; struct point v2; double A = 0.0; int i = 0; int loop = 0; cx = (R_L > 0) ? cx : cx * R_L; /* 判断应用在左幅还是右幅 */ do{ u1.x = SD_start_x[i]; u1.y = SD_start_y[i]; u2.x = SD_end_x[i]; u2.y = SD_end_y[i]; v1.x = SD_circle_x[i]+sd_d; v1.y = SD_circle_y[i]+sd_h; sd_scr = FS_D(v1.x, v1.y, cx, cy); A = FS_A(v1.x, v1.y, cx, cy,0); /* 把线延长2.929米(暂定),再做判断 */ v2.x = cx + (2.929 + sd_scr) * (cos(A*PI/180.0)); v2.y = cy + (2.929 + sd_scr) * (sin(A*PI/180.0)); loop = (intersect_in(u1,u2,v1,v2)); if (loop) break ; i += 1; if (i >= SD_size) return FALSE; /* 超出下限终止 */ }while(!loop); if (SD_R[i] == 0) return FALSE; if (SD_R[i] > 0) sd_cqw = sd_scr - (SD_R[i]+sd_r); if (SD_R[i] < 0) sd_cqw = fabs(cx-v1.x) - abs((SD_R[i]+sd_r)); return TRUE; }
bool crossline(int x1,int x2,int y1,int y2) { point u1,u2,v1,v2; u1.x=a[x1][0];u1.y=a[x1][1]; u2.x=a[x2][0];u2.y=a[x2][1]; v1.x=a[y1][0];v1.y=a[y1][1]; v2.x=a[y2][0];v2.y=a[y2][1]; return intersect_in(u1,u2,v1,v2); }
double solve() { if(l1.a.y==l1.b.y || l2.a.y==l2.b.y || (!intersect_in(l1,l2)) || parallel(l1,l2)) return 0; if(l1.a.y>l1.b.y+eps) swap(l1.a,l1.b); if(l2.a.y>l2.b.y+eps) swap(l2.a,l2.b); point ip=intersection(l1,l2); if(l1.b.y<ip.y || l2.b.y+eps<ip.y) return 0; point h,l; bool flag=true; if(l1.b.y>l2.b.y+eps) { h=l1.b; l=l2.b; } else if(l1.b.y<l2.b.y-eps) { h=l2.b; l=l1.b; } else { flag=false; h=l2.b; l=l1.b; } if(flag && ((h.x>=l.x && ip.x+eps< l.x &&(l.y-ip.y)*(h.x-ip.x) < (l.x-ip.x)*(h.y-ip.y)+eps) || (h.x<=l.x && ip.x> l.x+eps&&(l.y-ip.y)*(h.x-ip.x) > (l.x-ip.x)*(h.y-ip.y)-eps))) return 0; line tmp; tmp.a.x=min(min(l1.a.x,l2.a.x),min(l1.b.x,l2.b.x)); tmp.b.x=max(max(l1.a.x,l2.a.x),max(l1.b.x,l2.b.x)); tmp.a.y=tmp.b.y=l.y; point p1=intersection(tmp,l1); point p2=intersection(tmp,l2); double dist=p1.x-p2.x; if(dist<-eps) dist*=-1; return dist*(l.y-ip.y)/2; }