判断线段相交及求交

None.gif public  TNode TCrossNode(TNode P1, TNode P2, TNode Q1, TNode Q2)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if (! TSegmentCrossed(P1, P2, Q1, Q2))
InBlock.gif                
return null;
InBlock.gif
InBlock.gif            TNode cross 
= new TNode();
InBlock.gif
InBlock.gif            
if (Math.Abs(P1.Sx - P2.Sx) < ERR)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (Math.Abs(Q1.Sx - Q2.Sx) < ERR)
InBlock.gif                    
return null;
InBlock.gif                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    cross.Sx 
= P1.Sx;
InBlock.gif                    cross.Sy 
= (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * P1.Sx + Q1.Sy - (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx) * Q1.Sx;
InBlock.gif                    
return cross;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

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

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

ExpandedSubBlockEnd.gif            }

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

InBlock.gif            
else 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
double k1=0, k2=0;//斜率
InBlock.gif
                double a1=0, a2=0;//截距
InBlock.gif
                k1 = (P1.Sy - P2.Sy) / (P1.Sx - P2.Sx);
InBlock.gif                k2 
= (Q1.Sy - Q2.Sy) / (Q1.Sx - Q2.Sx);
InBlock.gif                a1 
= P1.Sy - k1 * P1.Sx;
InBlock.gif                a2 
= Q1.Sy - k2 * Q1.Sx;
InBlock.gif
InBlock.gif                
if (Math.Abs(k1 - k2) < ERR)
InBlock.gif                    
return null;
InBlock.gif
InBlock.gif                cross.Sx 
= (a2 - a1) / (k1 - k2);
InBlock.gif                cross.Sy 
= (a2 - a1) / (k1 - k2) * k1 + a1;//点斜式
InBlock.gif
                return cross;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

转载于:https://www.cnblogs.com/yuxon/archive/2006/06/28/437513.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值