private static void TestLineIntersect() { SegmentLine line = new SegmentLine(new NuGenSegment(0)); line.StartPoint = new Point(13,27); line.EndPoint = new Point(19, 55); line.Intersects(16, 36, 2.0); }
private void CutSegmentsLines() { cuts.Clear(); //cut_s = line_count; for(int b1=0; b1 < line_count-1; b1++){ SegmentLine it = segmentLines[b1]; for(int b2=b1+1; b2 < line_count; b2++) { SegmentLine it_next = segmentLines[b1]; if(it_next.start>=it.end)break; if(it_next.min<it.max && it.min<it_next.max){ Vector2 ret = Vector2.zero; if(fast_line_intersection(it.vec0, it.vec1, it_next.vec0, it_next.vec1, ref ret)){ //#ifdef VISIBILITY_STATS // stat_cuts++; //#endif if(it.cut==-1){ it.cut = cuts.Count; tmp_cut.line =it; cuts.Add(tmp_cut);//cuts.push_back(tmp_cut); cuts[it.cut].rets.Clear(); tmp_one_cut.distance = it.startd; tmp_one_cut.angle = it.start; tmp_one_cut.ret = it.vec1; cuts[it.cut].rets.Add(tmp_one_cut);//cuts[it.cut].rets.push_back(tmp_one_cut); tmp_one_cut.distance = it.endd; tmp_one_cut.angle = it.end; tmp_one_cut.ret = it.vec0; cuts[it.cut].rets.Add(tmp_one_cut);//cuts[it.cut].rets.push_back(tmp_one_cut); it.active=false; //#ifdef VISIBILITY_STATS // stat_lines--; //#endif } if(it_next.cut==-1){ it_next.cut=cuts.Count; tmp_cut.line =it_next; cuts.Add(tmp_cut);//cuts.push_back(tmp_cut); cuts[it_next.cut].rets.Clear(); tmp_one_cut.distance = it_next.startd; tmp_one_cut.angle = it_next.start; tmp_one_cut.ret = it_next.vec1; cuts[it_next.cut].rets.Add(tmp_one_cut);//cuts[it_next.cut].rets.push_back(tmp_one_cut); tmp_one_cut.distance = it_next.endd; tmp_one_cut.angle = it_next.end; tmp_one_cut.ret = it_next.vec0; cuts[it_next.cut].rets.Add(tmp_one_cut);//cuts[it_next.cut].rets.push_back(tmp_one_cut); it_next.active=false; //#ifdef VISIBILITY_STATS // stat_lines--; //#endif } /*const*/ Vector2 calc_vec = -ret; tmp_one_cut.distance = LENGTH_(calc_vec); tmp_one_cut.angle = Max(NormalAngle(calc_vec),0.0f); tmp_one_cut.ret = ret; cuts[it.cut].rets.Add(tmp_one_cut);//cuts[it.cut].rets.push_back(tmp_one_cut); cuts[it_next.cut].rets.Add(tmp_one_cut);//cuts[it_next.cut].rets.push_back(tmp_one_cut); } } } } for(int r1=0;r1<cuts.Count;r1++){ LINE_CUTS it = cuts[r1]; //LINE_CUTS * it=&cuts[r1]; //std::sort(it.rets.begin(),it.rets.end(),CUT_less()); //it.Sort((segment2, segment1) => (segment1.angle.CompareTo(segment2.angle)));//sort segments by the angle of the start vertex LINE_ONE_CUT last_cut = it.rets[0];//LINE_ONE_CUT * last_cut=&it.rets[0]; for (int r2=1;r2<it.rets.Count;r2++){ LINE_ONE_CUT rt = it.rets[r2];//LINE_ONE_CUT * rt=&it.rets[r2]; //insert new line ////if(line_count==lin_dyn.size()){lin_dyn.push_back(tmp_lin);lin_lst.push_back(NULL);} ////SEGMENT_LINE * line=&lin_dyn[line_count]; //skip above and Add new line at the end SegmentLine line = new SegmentLine(); //calc new line params line.vec1 = last_cut.ret; line.startd = last_cut.distance; line.startnew = line.start = last_cut.angle; line.vec0 = rt.ret; line.endd = rt.distance; line.endnew = line.end = rt.angle; line.active = true; line.intervals.Clear(); /*const*/ Vector2 ln = line.vec1-line.vec0; line.l = LENGTH_(ln); line.min = Min(line.endd,line.startd); line.max = Max(line.endd,line.startd); //line_min_distance(&line.vec[1],&line.vec[0],&line.min); LineMinDistance(line.vec1,line.vec0,Vector3.zero);//!!!! last_cut=rt; line_count++; segmentLines.Add(line); //#ifdef VISIBILITY_STATS // stat_cuts_new_lines++; // stat_lines++; //#endif } it.rets.Clear(); } //cut_e = line_count;//rendering only //pointerize //if(lin_lst.Count<line_count)lin_lst.resize(line_count); //for(int h1=0;h1<line_count;h1++)lin_lst[h1]=&lin_dyn[h1]; }
private void ConvertSegmentsToLines() { line_count=0; for(int iseg=0;iseg<segmentCount;iseg++) //for each Segment { Segment seg = segments[iseg]; //Segment is a class: REFERENCE TYPE! it is the segment now if(seg.active && seg.vertCnt>1){ //if the segment is still active for(int ls = 1; ls != seg.vertCnt; ls++){ //for each Point in the Segement -1 creates one lineSegment SegmentLine line = new SegmentLine(); //line vectors line.vec0 = seg.vert[ls-1]; line.vec1 = seg.vert[ls]; //ENTRY start and end angles/new start and end angles //Bottom half yields negativ values, Top-positive // however, for -pi we get +pi for the bottom half (-pi is same rotation as +pi), therefore Abs() line.start = line.startnew = Mathf.Abs( NormalAngle(line.vec0) ); line.end = line.endnew = Mathf.Abs( NormalAngle(line.vec1) ); //Debug.Log("start:"+line.start.ToString("F2")+"|end:"+line.end.ToString("F2")); //start, end, min & max distances line.startd = line.vec0.magnitude; line.endd = line.vec1.magnitude; line.min = Min(line.endd, line.startd); line.max = Max(line.endd, line.startd); line.min = Min(line.min, LineMinDistance(seg.vert[ls-1],seg.vert[ls],Vector3.zero)); //length //line.l = (line.vec0 - line.vec1).magnitude; Vector2 ln = line.vec1-line.vec0; line.l = LENGTH_(ln); line.active = true; //activity line.cut = -1; //cut array number //line.intervals = 0; segmentLines.Add(line); line_count++; } } } //sort by start segmentLines.Sort((segment2, segment1) => (segment1.start.CompareTo(segment2.start)));//sort segmentLiness by the angle of the start vertex // /* string sortTest = ""; for(int i=0; i < segmentLines.Count; i++){sortTest += ""+segmentLines[i].start.ToString("F2")+"\n";} Debug.Log(sortTest); //*/ }