游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2129|回复: 4

图形学问题,各位看看我错在哪里??高手帮忙修改一下,

[复制链接]

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2004-2-10 09:39:00 | 显示全部楼层 |阅读模式
图形学问题,各位看看我错在哪里??高手帮忙修改一下,谢谢~~~

这是一个图形学问题,判断两直线相交。问题出现在如果一条直线平行与X或Y轴,而另一条不平行,两条线段明显是相交的情况,这个函数却返回不相交0

举个例子判断线段AB CD是否相交
AX=50
AY=10
BX=50
BY=500
CX=10
CY=90
DX=600
DY=480
AB平行Y轴,又出错了,函数却返回0

如果AB是斜线,CD是平行X轴,两直线也是明显相交的情况,函数却判断不出来

[em5] [em5] [em5]

================================================

int InterLine(float fAx,float fAy,float fBx,float fBy,float fCx,float fCy,float fDx,float fDy) /*判断两直线相交*/
{
float a1 = 0;
float a2 = 0;
float b1,b2;

float x,y;


float fLineAMinx;
float fLineAMiny;
float fLineAMaxx;
float fLineAMaxy;

float fLineBMinx;
float fLineBMiny;
float fLineBMaxx;
float fLineBMaxy;


if(fBx != fAx)
a1 = (fBy - fAy) / (fBx - fAx);
if(fCx != fDx)
a2 = (fDy - fCy) / (fDx - fCx);

b1 = fBy - a1 * fBx;
b2 = fDy - a2 * fDx;

if(a1==a2)
return 0;

x = (b2 - b1) / (a1 - a2);
y = a1 * x + b1;


fLineAMinx = fAx;
fLineAMiny = fAy;
fLineAMaxx = fAx;
fLineAMaxy = fAy;

if( fBx < fLineAMinx)
fLineAMinx = fBx;
if( fBy < fLineAMiny)
fLineAMiny = fBy;
if( fBx > fLineAMaxx)
fLineAMaxx = fBx;
if( fBy > fLineAMaxy)
fLineAMaxy = fBy;

fLineBMinx = fCx;
fLineBMiny = fCy;
fLineBMaxx = fCx;
fLineBMaxy = fCy;

if( fDx < fLineBMinx)
fLineBMinx = fDx;
if( fDy < fLineBMiny)
fLineBMiny = fDy;
if( fDx > fLineBMaxx)
fLineBMaxx = fDx;
if( fDy > fLineBMaxy)
fLineBMaxy = fDy;

if(x <= fLineAMaxx && x >= fLineAMinx && x <= fLineBMaxx && x >= fLineBMinx &&
y <= fLineAMaxy && y >= fLineAMiny && y <= fLineBMaxy && y >= fLineBMiny)
return 1;

return 0;
}
[em4] [em4] [em4]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20468
发表于 2004-2-10 10:27:00 | 显示全部楼层

Re:图形学问题,各位看看我错在哪里??高手帮忙修改一

?你段我HoHo引擎?面的代?片?啵?M?δ阌?椭?

struct LIBRARY_BASE_API tag_msLine
{
    float fBeginX, fBeginY;
    float fEndX, fEndY;
    float fK;
};
typedef tag_msLine*                        LP_MS_LINE;
typedef tag_msLine                        MS_LINE;


// 交换两个浮点数,大->小排列
void msMax2Min( float* fA, float* fB )
{
    if( *fA < *fB )
    {
        float temp = *fA;
        *fA = *fB;
        *fB = temp;
    }
}


// 获取相交的坐标点
// 两条线段Line1 & Line2 计算其交点,并返回为参数指针x,y
// 若没有交点,函式返回false
bool msGetX( LP_MS_LINE pLine1, LP_MS_LINE pLine2, float* x, float* y )
{
    // 获取两线交点
    *x = ( pLine2->fK * pLine2->fBeginX - pLine1->fK * pLine1->fBeginX + pLine1->fBeginY - pLine2->fBeginY ) / ( pLine2->fK - pLine1->fK );
    *y = pLine1->fK * ( *x - pLine1->fBeginX ) + pLine1->fBeginY;

    // 坐标排序,以便于后面计算
    MS_LINE Line1, Line2;
    Line1.fBeginX = pLine1->fBeginX;
    Line1.fBeginY = pLine1->fBeginY;
    Line1.fEndX = pLine1->fEndX;
    Line1.fEndY = pLine1->fEndY;

    Line2.fBeginX = pLine2->fBeginX;
    Line2.fBeginY = pLine2->fBeginY;
    Line2.fEndX = pLine2->fEndX;
    Line2.fEndY = pLine2->fEndY;

    msMax2Min( &Line1.fEndX, &Line1.fBeginX );
    msMax2Min( &Line1.fEndY, &Line1.fBeginY );
    msMax2Min( &Line2.fEndX, &Line2.fBeginX );
    msMax2Min( &Line2.fEndY, &Line2.fBeginY );


    // 判定交点是否在线段内
    if( *x > Line1.fBeginX && *x < Line1.fEndX && *y > Line1.fBeginY && *y < Line1.fEndY )
        if( *x > Line2.fBeginX && *x < Line2.fEndX && *y > Line2.fBeginY && *y < Line2.fEndY )
            return true;
    return false;
}

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
 楼主| 发表于 2004-2-10 13:19:00 | 显示全部楼层

Re:图形学问题,各位看看我错在哪里??高手帮忙修改一

谢谢,但如果AB平行与Y轴,还是有问题
比如
A(276,135)
B(276,320)

C(343,157)
D(225,268)

哪位好心人,帮忙看看我的函数错在那里呀,谢谢~~~~~~

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-2-12 02:00:00 | 显示全部楼层

Re:图形学问题,各位看看我错在哪里??高手帮忙修改一

。。。直线相交。。。有必要用公式么 :(
线段,
步骤可以
1 ,求交点。
2 ,有交点 比较交点是否在直线内,只比较一根直线的一个坐标就够了,不用两个直线的两个坐标都比。
做法大概象是这样。
1 ,直线交点公式 2  , 我习惯选线段1,检查X Y排序,看那个坐标不是平行的就用哪个。
然后 大点.x>交点.x>小点.x (也可能是.y) 就在直线内.
既两点相交。
SEA_bug你写的时候是不是两条线都比了呀。。。重了吧?
伪代码,1 的公式就不给了,就是直线相交公式
2. 我爱选line1

//消除平行的影响 平行于Y轴就选y,不然默认选x.
if( line1.point1.x = line1.point2.x)
{
    排序 line1的y坐标 ,比较 far.y >交点的 y >near.y
    得到相交?
else
{
     排序 line1的x坐标 ,比较 far.x >交点的 x >near.x
    得到相交?
}
你再看看,第2部其实应该都可能还有潜力可挖,找找现代书。
第一部,直线求交就是找公式吧,我就不班门弄斧的压代码了。可以去现代上看看?

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-2-12 02:07:00 | 显示全部楼层

Re:图形学问题,各位看看我错在哪里??高手帮忙修改一

原理是
直线的交点在直线上 。。。。。。
所以只需要一个坐标。。。。。。

还有做法有
1 求点在直线的上下, 正统需要代4次(2条直线,2个点),但也可以优化。
2  还没想好,想睡觉了。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 06:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表