| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 530 人关注过本帖
标题:图形(直线)命中问题
只看楼主 加入收藏
cacker
该用户已被删除
收藏
已结贴  问题点数:20 回复次数:5 
图形(直线)命中问题
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: 方程式 
2010-12-23 22:51
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:20 
有两个问题,第一,你不能使用斜截式,这样在斜率接近90度的时候会出问题,你应该用一般方程
第二个问题,你需要判断过那个点作的垂线的垂足在不在那个线段上,这个可以用向量乘法完成计算
如果垂足在不在那个线段上,你就要分别计算那个点到线段的两个端点的距离,最较小的那一个
如上分两种情况处理,那样就可以完美解决了

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-23 23:04
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-12-23 23:52
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
假设那个线段是AB,线外的点是P
cos<PAB> = (AP * AB) / (|PA| * |AB|)
这个的cos值,如果为负数,就说明这个角是钝角,那么垂足就不在那个线段上,还有BP * BA,都测试一次

至于点到直线的距离,用两点式有面积法
2S = |(Ax-Bx)(Py-By) - (Px-Bx)(Ay-By)| = |PO| * |AB| (假设O是P在AB上的垂足)
所以可得PO = |(Ax-Bx)(Py-By) - (Px-Bx)(Ay-By)| / |AB|

等我给你写一个子函数吧

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-24 00:18
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
#include <math.h>

//定义点结构
struct point
{
    double x;
    double y;
};

//定义精度误差
const double eps = 1e-6;

//两点距离
double distance(const point &p1, const point &p2)
{
    double dx = p1.x - p2.x, dy = p1.y - p2.y;
    return sqrt(dx * dx + dy * dy);
}

//返回两点与原点组成的三角形面积的两倍
double multi(const point &p1, const point &p2)
{
    return p1.x * p2.y - p1.y * p2.x;
}

//向量点乘
double dotmul(const point &p1, const point &p2)
{
    return p1.x * p2.x + p1.y * p2.y;
}

//计算点到线段的距离,a,b定义那个线段,p为要计算的点
double pointToLine(point a, point b, const point& p)
{
    point ab, o = {0};
    ab.x = b.x - a.x; ab.y = b.y - a.y;
    a.x -= p.x;       a.y -= p.y;
    b.x -= p.x;       b.y -= p.y;
    if (dotmul(a, ab) > -eps) return distance(o, a);
    ab.x = -ab.x; ab.y = -ab.y;
    if (dotmul(b, ab) > -eps) return distance(o, b);
    return fabs(multi(a, b)) / distance(a, b);
}

//测试代码
#include <stdio.h>

int main()
{
    point a = {0, 0}, b = {20, 39.9};
    point p = {40, 80}; //换成10, 20会得到很小的结果
    double dis = pointToLine(a, b, p);
    printf("%f\n", dis);
    return 0;
}

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-12-24 00:51
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-12-24 13:56
快速回复:图形(直线)命中问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026052 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved