热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

已知两条直线各自两个端点,求它们的夹角和中心线的公式

请提供它们的公式,给出程序算法更好。非常感谢!
请提供它们的公式,给出程序算法更好。非常感谢!

22 个解决方案

#1


UPUP

#2


直线公式

x-x1    y-y1
-----==-----
x2-x    y2-y

#3


cosB=a^2+b^2+c^2-2cosAcosB

太繁了,应该有简单的.

#4


对于任何一个线段, 都可以转换成为向量形式 (V, start, len)
   v:表示方向向量,单位的
   start表示开始点
   len表示长度
这种方式表达的两个线段的夹角就是各自的方向向量的点积然后求acos数值即可

如果是二维空间的,使用顶点坐标直接计算的方法就是(三维空间也很类似的):
两个线段四个顶点坐标 line1{(x1,y1), (x2,y2)},  line2{(x3,y3),  (x4,y4)}
夹角为
  dx1 = x2-x1;
  dx2 = x4-x3;
  dy1 = y2-y1;
  dy2 = y4-y3;
夹角 =   acos(  (dx1*dx2+dy1*dy2)/sqrt(dx1*dx1+dx2*dx2+dy1*dy1+dy2*dy2) )

线段的中心线是什么概念
两个线段的中心点的连线?那不直接就出来了

#5


假设两条直线的两个点分别为 直线1(a1,b1),(a2,b2) 直线2(m1,n1) (m2,n2),
首先判断是不是平行,

    (a2-a1)/(b2-b1)=(m2-m1)/(n2-n1) 平行和重合无焦点,
    
然后 列公式,联力解方程组,得交点,
能得到一个公式 即交点.x=?; 交点.y=?,
求角度,比较麻烦,得比较直线的走向,即比较x1和x2的大小,得是1,3象限的走向,还是2,4象限的走向,然后求sin值,转成(0-360)的角度
*****************************************************************************************
下面的式子,希望对你有用:
是在窗体左上为(0,0)右下为(max,max)中, 已知半径1000,原点(X1,y1),角度@(人类的坐标系), 得到圆周上的点(x2,y2)坐标值
sangleline.X2 = 1000 * Cos(2 * pi * (@ - 90) / 360) + sangleline.X1
sangleline.Y2 = 1000 * Sin(2 * pi * (@ - 90) / 360) + sangleline.Y1

#6


更正一下:
 夹角 =   acos(  (dx1*dx2+dy1*dy2)/sqrt((dx1*dx1++dy1*dy1)*(dx2*dx2+dy2*dy2)) )

原理和上面说的向量方式是一致的,不过是简化了独立的取模操作
line1(p1, p2); line2(p3, p4)
向量v1 = p2-p1
向量v2 = p4-p3;
v1*v2 = |v1| * |v2|* cos (v1,v2之间的夹角)
所以两个线段之间的夹角就是
acos ( v1*v2 / |v1|*|v2| )
v1*v2 = (p2-p1) * (p4-p3)
|v1|*|v2| = ( |p2-p1| * |p4-p3| )
简化后就是前面的公式了
在使用的时候,需要注意sqrt内部的数值不能是0,否则就除0
sqrt内部部分为0的充要条件就是 一个线段退化成为了一个点

这个计算结果返回的是两个线段之间 0到180度 之间的弧度角

#7


我说的中心线是指穿过夹角中心并经过交点的一条直线。最好能给出这个中心线的方程。

#8


角平分线?
那就是到这两个线段所在直线距离相等的直线
这样的直线是有可能有两条的啊

还是当作二维来理解吧
在三维情况下,可能最多的时候是有两个平面的

是角平分线吗?

#9


两个向量v1和v2,找到另外一个向量,使得v1*v = v2*v而已
对于v1,v2在这个题目下,都可以是非单位的
那么

(v.x * v1.x + v.y*v1.y)/|v1| = (v.x * v2.x + v.y*v2.y) / |v2|
于是有
v.x = -|v1|v2.y + |v2|v1.y
v.y =  |v1|v2.x - |v2|v1.x
的时候上面的等式成立

因此这个平分向量就是 ( -|v1|v2.y + |v2|v1.y,  |v1|v2.x - |v2|v1.x)
事实上,这个向量的垂直向量,就是v1. -v2的平分向量

对于这两个线段来说, v1,v2的平分向量以及它的垂直向量都是可能的答案

找到了这个向量后,就是找一个公共点了
这个公共点不希望以计算交点的方法来解决
因为如果两个线段平行,那么就是找不到这个交点
我们可以通过找一个到两条直线距离都相等的特殊点的办法来实现

#10


根据点到直线的距离公式,联立是可以求解出来交点的
这个点肯定是存在的

它不象两个直线的交点,在平行时候不存在
距离两个直线距离相等的点肯定是存在的

#11


计算这条直线还有没有别的简单办法?

#12


办法有很多, 但是你最好都是把公式依次推倒出来, 然后看看那些地方可以简化的
上面给出的东西都是这样来的

因为实际上, 答案都是唯一的
得到它的路径有多个
无论是那个都可以
关键是对最终的结果的表达方式,如何最简单最有效才是好的

比如,关于中心线的角度,完全可以计算出一个直线的角度,再加上夹角来生成,如果加法不对就用减法,顶多多一次测试就知道正确的角度,可是那样计算就复杂一些,得到的结果肯定是一样的

#13


v1 和 v2 两个向量, 把他们单位化,或者是模取相同的时候,把两个向量做加法, 也可以得到中心线的方向向量了
因为平行四边形的对角线是平分夹角的

即:
    v1/|v1| + v2/|v2|
就是这个方向向量了

如果两个线段不平行,找到交点,和这个向量合成就是所求了

#14


将一条直线置平,将另一条直线的端点变换到新坐标系中,看这个帖子:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=202254
计算角度:
// 计算角度 2002.4.8.
double WINAPI CalAngle(double x, double y)
{
double dAngle;
if(fabs(x)>0)
{
dAngle = atan(y/x)/PI*180.0;
if(dAngle>0)
{
if(x<0)dAngle += 180.0;
}
else if(dAngle<0)
{
if(y>0)dAngle = 180+dAngle;
else dAngle = 360+dAngle;
}
else
{
if(x<0) dAngle = 180;
}
}
else
{
if(y>0)dAngle = 90.0;
else dAngle = 270.0;
}
return dAngle;
}
中心线也好求。

#15


这段程序在忙什么呢?
如果是计算角度,干嘛不直接用atan2这个函数计算呢,直接得到了2PI范围内的角度
atan做不到的, atan2可以做到啊.

#16


atan2 是怎么 函数?

#17


自己看msdn去
atan, atan2
Calculates the arctangent of x (atan) or the arctangent of y/x (atan2).

double atan( double x );
double atan2( double y, double x );

atan returns the arctangent of x. atan2 returns the arctangent of y/x. If x is 0, atan returns 0. If both parameters of atan2 are 0, the function returns 0. You can modify error handling by using the _matherr routine. atan returns a value in the range –π/2 to π/2 radians; atan2 returns a value in the range –π to π radians, using the signs of both parameters to determine the quadrant of the return value.

#18


l1:(x1,y1)-(x2,y2)
l2:(x3,y3)-(x4,y4) 先考虑二维的
l1的方向数:d1=(x2-x1,y2-y1)
l2  ...  :d2=(x4-x3,y4-y3)
cos=cos=d1*d2/|d1|*|d2| 或者它的余角

如果你说的中心线指的角平分线。
设中心线上的点M(x,y),先写出两直线的方程
l1:f1(x,y)=0
l2:f2(x,y)=0
利用点到两直线距离相等得一方程g(x,y)=0,即为所求。

#19


没研究过atan2函数,它从-PI to PI,我要求从0 to 2PI,不知道会不会有所不同。

#20


函数 atan2 在 Turbo C 中就已经有了,但Turbo Pascal 中没有,要自己编。

#21


要将(-PI to PI)转变为(0 to 2PI),只要值为负时 +2PI 就行了。

#22


How do I find intersections of 2 2D line segments?

    This problem can be extremely easy or extremely difficult; it
    depends on your application. If all you want is the intersection
    point, the following should work:

    Let A,B,C,D be 2-space position vectors.  Then the directed line
    segments AB & CD are given by:

        AB=A+r(B-A), r in [0,1]
        CD=C+s(D-C), s in [0,1]

    If AB & CD intersect, then

        A+r(B-A)=C+s(D-C), or

        Ax+r(Bx-Ax)=Cx+s(Dx-Cx)
        Ay+r(By-Ay)=Cy+s(Dy-Cy)  for some r,s in [0,1]

    Solving the above for r and s yields

            (Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy)
        r = -----------------------------  (eqn 1)
            (Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

            (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
        s = -----------------------------  (eqn 2)
            (Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

    Let P be the position vector of the intersection point, then

        P=A+r(B-A) or

        Px=Ax+r(Bx-Ax)
        Py=Ay+r(By-Ay)

    By examining the values of r & s, you can also determine some
    other limiting conditions:

        If 0<=r<=1 & 0<=s<=1, intersection exists
            r<0 or r>1 or s<0 or s>1 line segments do not intersect

        If the denominator in eqn 1 is zero, AB & CD are parallel
        If the numerator in eqn 1 is also zero, AB & CD are collinear.

    If they are collinear, then the segments may be projected to the x- 
    or y-axis, and overlap of the projected intervals checked.

    If the intersection point of the 2 lines are needed (lines in this
    context mean infinite lines) regardless whether the two line
    segments intersect, then

        If r>1, P is located on extension of AB
        If r<0, P is located on extension of BA
        If s>1, P is located on extension of CD
        If s<0, P is located on extension of DC

    Also note that the denominators of eqn 1 & 2 are identical.



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
大爱与你_邂逅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有