已知等边三角形两点坐标,计算第三点坐标

已知等边三角形两点坐标,计算第三点坐标

大家好,又见面了,我是全栈君。

事实上平面中只要确定两个点的坐标,只要这两个点的坐标不重合就能够绘制出等边三角形,并且不仅仅能够绘制出一个而是两个等边三角形。绘制出来的两个等边三角形就好比如菱形一样。

那么就开始动手计算吧。

计算第三个点的坐标的主要流程大概如下所示:

1.给出两个点(检测两个点是否是同一个点);

2.计算边长;

3.判断两种特殊情况,两点构成的线段是否是平行或者垂直于坐标轴(后续使用点斜式计算);

4.计算截距(b)以及斜率(k); y= kx+b;

5.计算出两点的中点坐标,使用斜率k1*k2 = -1的定律进行计算斜率k2;

6.由k2以及一个点计算出垂直的直线的直线公式;

7.后续调用点到中心点的距离以及直线二的公式进行求解出两个x,之后代入直线二的方程进行计算两个y出来;

8.上面的三角形的y大于中心点的y0,下面的三角形就刚好相反;(这里就可以确定三角形的第三个点了)

代码实现如下:

bool dengbian()
{ 

double xa, ya, xb, yb;  // 已知的两点坐标
double FindX1, FindY1, FindX2, FindY2;    // 求出的等边三角形的第三个点的坐标 , 一般都会有两个喔
// 两点重合
if (fabs(xa - xb) < 0.001 && fabs(ya - yb) < 0.001)
{ 

return false;
}
else { 

// 首先把公用的数据计算出来(边长、中点坐标)
double sideLength1 = (xa - xb);
double sideLength2 = (ya - yb);
double sideLength = sqrt(sideLength1*sideLength1 + sideLength2 * sideLength2);
double tempX, tempY;      // 中点坐标
tempX = (xa + xb) / 2;
tempY = (ya + yb) / 2;
if (fabs(xa - xb) < 0.001)       // 垂直的情况下
{ 

FindY1 = tempY;
FindY2 = tempY;
double temp_len = sqrt(3.0) / 2 * sideLength;
FindX1 = tempX + temp_len;
FindX2 = tempX - temp_len;
return true;
}
else if (fabs(ya - yb) < 0.001)    // 平行的情况下
{ 

FindX1 = tempX;
FindX2 = tempX;
double temp_len = sqrt(3.0) / 2 * sideLength;
FindY1 = tempY + temp_len;
FindY2 = tempY - temp_len;
return true;
}
else { 

double k, k1;       // 斜率
double b, b1;        // 截距
k = (yb - ya) / (xb - xa);
b = ya - k * xa;
k1 = -1 / k;
b1 = tempY - k1 * tempX;     // 到这里为止,两条直线公式已经求出来了
// 根据求根公式进行求解
double db;
db = 2 * k1*(b1 - tempY) - 2 * tempX;
double da;
da = k1 * k1 + 1;
double dc;
dc = tempX * tempX + (b1 - tempY)*(b1 - tempY) - (3.0 / 4) * sideLength * sideLength;
double dx;    // sqrt(b*b - 4*a*c)
dx = db * db - 4 * da * dc;        // 这个应该是没有开方之前在进行
if (dx < 0)
{ 

// 不能够构成等边三角形
return false;
}
dx = sqrt(db*db - 4 * da * dc);    // 开方
double x1, x2, y1, y2;
x1 = ((-db + dx) / (2 * da));            
x2 = ((-db - dx) / (2 * da));
y1 = x1 * k1 + b1;
y2 = x2 * k1 + b1;
// 判断哪个点的坐标是上等边三角形,哪个点的坐标是下等边三角形
// 上等边三角形的第三个点的坐标的Y轴坐标必定大于中点的Y轴的坐标,以其为判断标准即可判断出
if (y1 > tempY)
{ 

FindX1 = x1;
FindY1 = y1;
FindX2 = x2;
FindY2 = x2;
}
else { 

FindX1 = x2;
FindY1 = y2;
FindX2 = x1;
FindY2 = y1;
}
return true;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115090.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 对不起,学会这些 Linux 知识后,我有点飘

    对不起,学会这些 Linux 知识后,我有点飘Linux简介UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说UNIX,那是因为Linux是由UNIX发展而来的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux继承了UNIX的设计目标。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux操作系统无处不在。大多数程序员都喜欢让系统尽量简单,优雅并具有一致性。举个例子,从最底层的角度来讲,一个文件应该只是一个字节集合。为了实现顺序存取、随机存取、按键存取、远程存取只能是

  • iOS国际化时遇到的错误:read failed: the data couldn&#39;t be read because it isn&#39;t in the correct format.

    iOS国际化时遇到的错误:read failed: the data couldn&#39;t be read because it isn&#39;t in the correct format.

  • 数据结构,计算机网络,数据库,计算机组成原理,操作系统有哪些好的网课值得推荐?[通俗易懂]

    大家好,我是小林哥。作为自学CS过来的老学长,看过中国mooc、b站、网易云课堂很多视频,期间踩了不少坑,这次掏心掏肺前来跟分享下,网上的资源是免费的,但是找到质量好的是需要时间成本的!数据结构,计算机网络,数据库,计算机组成原理,操作系统这些在大学期间一定要掌握好来,因为现在互联网大厂面试都爱考察这些内容,一句话,计算机基础,yyds!可能大家第一个问题是,这些课需要哪些先学?讲真,这些都是独立的课程,关联性不会大到说学这个课前要先学另外一个课,所以大家不要担心这个问题,它不是问题!可能大家也会

  • Java内存管理-掌握自定义类加载器的实现(七)

    勿在流沙筑高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoader的设计思想,读源码相对来说是比较枯燥的,还是这个是必须要走的过程,学习源码中的一些思想,一些精髓,看一下大神级人物是怎么写出那么牛逼的代码。我们能够从中学到一点点东西,那也是一种进步和成长了…

  • VS2013过期激活,VS2013激活,vs2013序列号,VS2013密钥,VS013产品密匙

    VS2013过期激活,VS2013激活,vs2013序列号,VS2013密钥,VS013产品密匙vs2013认证许可已过期vs2013旗舰版密匙VS2013ultimatekeyVS2013激活码序列号,产品密钥,产品密匙,验证码,vs2013旗舰版破解:破解密匙,破解序列号:然后点击”更改我的产品许可证”, 不要点登录那里。。。输入密钥 BWG7X-J98B3-W34RT-33B3R-JVYW9即

  • java命令行执行 jar_java命令打包jar

    java命令行执行 jar_java命令打包jar摘要这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包。学会如何写一段转换jar包的程序,将你的jar包转换成你能使用java-jar命令运行jar包或象在windows系统上那样通过双击来运行jar包。你可以很容易地将一个应用的所有的类和资源打包到一个jar文件中去。事实上,这只是打包的一个原因。另一个原因是让用户很容易地执行包中的应用。那么在java的…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号