示例#1
0
        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);
        //*/
    }