判断线段相交及求交

public TNode TCrossNode(TNode P1, TNode P2, TNode Q1, TNode Q2)
        
{
            
if (! TSegmentCrossed(P1, P2, Q1, Q2))
                
return null;

            TNode cross 
= new TNode();

            
if (Math.Abs(P1.Sx - P2.Sx) < ERR)
            
{
                
if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
                    
return null;
                
else
                
{
                    cross.Sx 
= P1.Sx;
                    cross.Sy 
= (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * P1.Sx + Q1.Sy - (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * Q1.Sx;
                    
return cross;
                }

            }

            
else if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
            
{
                cross.Sx 
= Q1.Sx;
                cross.Sy 
= (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * Q1.Sx + P1.Sy - (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx) * P1.Sx;
                
return cross;
            }

            
else if (Math.Abs(P1.Sy - P2.Sy) < ERR)
            
{
                
if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
                    
return null;
                
else
                
{
                    cross.Sy 
= P1.Sy;
                    cross.Sx 
= (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * P1.Sy + Q1.Sx - (Q1.Sx - Q2.Sx) / (Q1.Sy - Q2.Sy) * Q1.Sy;
                    
return cross;
                }

            }

            
else if (Math.Abs(Q1.Sy - Q2.Sy) < ERR)
            
{
                cross.Sy 
= Q1.Sy;
                cross.Sx 
= (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * Q1.Sy + P1.Sx - (P1.Sx - P2.Sx) / (P1.Sy - P2.Sy) * P1.Sy;
                
return cross;
            }

            
else 
            
{
                
double k1=0, k2=0;//斜率
                double a1=0, a2=0;//截距
                k1 = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx);
                k2 
= (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx);
                a1 
= P1.Sy - k1 * P1.Sx;
                a2 
= Q1.Sy - k2 * Q1.Sx;

                
if (Math.Abs(k1 - k2) < ERR)
                    
return null;

                cross.Sx 
= (a2 - a1) / (k1 - k2);
                cross.Sy 
= (a2 - a1) / (k1 - k2) * k1 + a1;//点斜式
                return cross;
            }

        }

posted on 2006-06-28 10:07  口俞克木公  阅读(1747)  评论(4编辑  收藏  举报

导航