线段与圆是否相交

判断圆和线段是否相交。分两种情况:



1、如图1 所示,有至少一个线段的端点落在圆内,这个只要判断点在圆内就好了,端点到圆心的距离小于等于半径 ;
2、如图2,3所示, 两个端点都不在圆内,那么看圆心到线段所在直线的垂足是否小于半径且垂足在线段上;我们可以利用余弦定理,避免判断垂足是否在线段上,只要圆心到两端点的角度都为锐角,那么他必然相交;

推导过程如下:

线段所在直线方程的一般式为:ax+by+c=0;线段两个端点A(x1,y1),B(x2,y2);圆心O(px,py),根据y=kx+z;那么直线斜率k=y1-y2/x1-x2;然后再将点A带入方程可得z=(x1y2-x2y1)/(x1-x2),然后转化成一般式的形式则:

a=y1-y2,b=x2x1,c=x1y2-x2y1。

再根据点到直线距离公式:

余弦定理:

int pan_duan(Point *p1, Point *p2,double r) {//点p1和p2都不在圆内
    double a, b, c, dist1, dist2, angle1, angle2; // ax + by + c = 0;
    if (p1->x == p2->x)
        a = 1, b = 0, c = -p1->x;//特殊情况判断,分母不能为零
    else if (p1->y == p2->y)
        a = 0, b = 1, c = -p1->y;//特殊情况判断,分母不能为零
    else {
        a = p1->y - p2->y;
        b = p2->x - p1->x;
        c = p1->x * p2->y - p1->y * p2->x;
    }
    dist1 = a * O.x + b * O.y + c;
    dist1 *= dist1;
    dist2 = (a * a + b * b) * r * r;
    if (dist1 > dist2) return 0;//点到直线距离大于半径r
    angle1 = (O.x - p1->x) * (p2->x - p1->x) + (O.y - p1->y) * (p2->y - p1->y);
    angle2 = (O.x - p2->x) * (p1->x - p2->x) + (O.y - p2->y) * (p1->y - p2->y);
    if (angle1 > 0 && angle2 > 0) return 1;//余弦都为正,则是锐角
    return 0;
}


VB编程大赛:求相交点代码 这是一个求两相交点的程序。界面中有图区,操作及显示区。操作分为两个步骤: 1· 创建弧" 。 点击“创建槐按钮,可进入创建弧工作状态。进入创建弧工作状态以后,光标进入有坐标线的图区变为十字线,图区的下面显示光标坐标。在适当位置点击左键,这是弧的一个端点,有一个黑点显示在那里,同时把这点显示出来。移动光标后在适当位置再次点击左键,这是上的一个点,有一个绿点显示在那里,同时把这点显示出来,同时出现一蓝色的皮筋弧在随光标移动,心点由土黄色的点来表示。皮筋弧以黑点为正向(逆时针),在适当位置再次点击左键,弧变为绿色并固定下来,把这点显示出来,这个弧就创建好了,同时把这个弧的参数显示出来。可以继续创建新的唬 2· 选取弧,当创建了两个或两个弧时,“选取槐按钮开始有效,点击“选取槐按钮,可进入选取弧工作状态。光标在接近已创建的弧时,那个弧会变成红色,点击左键,这个弧变为紫色,表示被选取的第一个唬当光标再次接近其它已创建的弧时,那个弧会变成红色,点击左键,这个弧变为黑色,表示被选取的第二个唬每次选取的弧参数都被显示出来,当选取弧了两个弧后,开始计算这时两个弧的交点并显示结果。通常有2个交点,分别用红蓝两色点表示。无效交点用灰色点表示,数据也用灰色显示。如无交点也有显示。 点击“重 新 选 缺按钮,将清除刚才的结果,可以重新选取,在运行中,下部的信息栏中显示运行状态并提示下一步的操作,由于这只是一个求两相交点的程序,所以只采用了在屏幕上三点(不在一条直线上)做弧的方法创建弧,略去其它方法,并且略去弧编辑、修改、删除、比例等功能。
HTML主要用于网页的结构和内容的呈现,无法直接进行线段和面的交点计算。需要结合JavaScript等编程语言来实现。 一种计算线段和面交点的方法是:首先判断线段是否与面相交,如果相交再计算交点。具体实现步骤如下: 1. 计算面的法向量。 2. 计算线段的方向向量。 3. 判断线段是否与面相交,如果不相交则直接结束。 4. 如果线段与面相交,则计算线段与面的交点。 下面是一个简单的JavaScript函数,用于计算线段和面的交点: ```javascript function getIntersection(lineStart, lineEnd, plane) { // 计算面的法向量 var normal = new Vector3(plane[0], plane[1], plane[2]); // 计算线段的方向向量 var direction = new Vector3( lineEnd[0] - lineStart[0], lineEnd[1] - lineStart[1], lineEnd[2] - lineStart[2] ); // 计算线段的起点到面的距离 var startDistance = normal.dot(lineStart) - plane[3]; // 计算线段的终点到面的距离 var endDistance = normal.dot(lineEnd) - plane[3]; // 如果线段的起点和终点都在面的同侧,则无交点 if (startDistance * endDistance > 0) { return null; } // 计算线段与面的交点 var t = startDistance / (startDistance - endDistance); var intersection = new Vector3( lineStart[0] + t * direction.x, lineStart[1] + t * direction.y, lineStart[2] + t * direction.z ); return intersection; } ``` 其中,lineStart和lineEnd分别为线段的起点和终点,plane为面的方程,包含4个参数:ax + by + cz + d = 0,分别表示面法向量的x、y、z分量和d值。函数返回线段和面的交点,如果无交点则返回null。 需要注意的是,该函数只能计算线段和平面的交点,如果要计算线段和三角形面的交点,需要先将三角形面拆分成三个平面,再分别计算交点
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值