我有一个三角形,我知道两个顶点的坐标:A=(x1,y1),B=(x2,y2) 所有角度:ABC=90∘,CAB=30∘ 和 BCA=60∘ 以及所有边长度。如何找到第三个顶点 C=(x3,y3) 的坐标?
我知道有两种解决方案(我都想要)。
我有一个三角形,我知道两个顶点的坐标:A=(x1,y1),B=(x2,y2) 所有角度:ABC=90∘,CAB=30∘ 和 BCA=60∘ 以及所有边长度。如何找到第三个顶点 C=(x3,y3) 的坐标?
我知道有两种解决方案(我都想要)。
你得到积分:
x3 = x2 + s*(y1 - y2)
y3 = y2 + s*(x2 - x1)
和
x3 = x2 + s*(y2 - y1)
y3 = y2 + s*(x1 - x2)
在哪里s = 1/sqrt(3) ≈ 0.577350269
在 30-60-90 直角三角形中,最小的腿(与 90 度角相邻的最小边)的长度是斜边(与 90 度角相对的边)的 1/2,所以既然你有边长,你可以确定哪条腿是线段AB。
从中您可以推断出角度的去向。
然后要计算坐标,您只需要在正确的角度以正确的半径长度选择半径圆上的点。
两种解决方案来自顺时针或逆时针测量角度,并产生对称三角形,边 AB 是对称线。
由于您已经给出了角度,因此通过二次公式计算 AB 的长度
L(AB) = Sqrt[(x1-x2)^2 + (y1-y2)^2]。
现在,让 x = L(AC) = 2*L(BC) 所以因为它是直角三角形,
L(AC)^2 = L(BC)^2 + L(AB)^2,
x^2 = (0.5x)^2 + L(AB)^2,所以 L(AB) = x*Sqrt[3]/2,因为你已经计算了 L(AB),你现在有了 x。
原始 AB 的角度为 a = arctan([y2-y1]/[x2-x1])。现在您可以向上或向下测量 30 度(根据需要使用 a+30 或 a-30)并以角度 a +/- 标记半径 x(我们在上面计算)的圆(以 A 为中心)上的点 C 30.
那么,C有坐标
x3 = x1 + x*cos(a+30)
y3 = y1 + x*sin(a+30)
或者您可以使用 (a-30) 来获得对称三角形。
如果提供两个点和边数作为输入,这是返回完整多边形点的代码。这是为 Android(Java) 编写的,逻辑可以重用于其他语言
private static final float angleBetweenPoints(PointF a, PointF b) {
float deltaY = b.y - a.y;
float deltaX = b.x - a.x;
return (float) (Math.atan2(deltaY, deltaX));
}
private static PointF pullPointReferenceToLineWithAngle(PointF a, PointF b,
float angle) {
float angleBetween = angleBetweenPoints(b, a);
float distance = (float) Math.hypot(b.x - a.x, b.y - a.y);
float x = (float) (b.x + (distance * Math.cos((angleBetween + angle))));
float y = (float) (b.y + (distance * Math.sin((angleBetween + angle))));
return new PointF(x, y);
}
private static List<PointF> pullPolygonPointsFromBasePoints(PointF a,
PointF b, int noOfSides) {
List<PointF> points = new ArrayList<>();
points.add(a);
points.add(b);
if (noOfSides < 3) {
return points;
}
float angleBetweenTwoSides = (float) ((((noOfSides - 2) * 180) / noOfSides)
* Math.PI / 180);
for (int i = 3; i <= noOfSides; i++) {
PointF nextPoint = pullPointReferenceToLineWithAngle(
points.get(i - 3), points.get(i - 2), angleBetweenTwoSides);
points.add(nextPoint);
}
return points;
}
用法是onDraw方法:
PointF a = new PointF(100, 600);
PointF b = new PointF(300, 500);
int noOfSides = 3;
List<PointF> polygonPoints = pullPolygonPointsFromBasePoints(a, b,
noOfSides);
drawPolyPoints(canvas, noOfSides, polygonPoints);
这是一个直角三角形。角 ABC 是 90 度,所以计算连接 A 到 B 的向量并将其称为 AA 并对其进行归一化:
AA = (x2-x1,y2-y1) / |(x2-x1,y2-y1)|
垂直于的单位向量AA
由下式给出
BB = (-(y2-y1),x2-x1) / |(x2-x1,y2-y1)|
因为 AC 垂直于 AB,所以你可以得到你的第一个P1
点
P1 = (x2,y2) + K * BB
其中 K 是等于边 AC 长度的标量值(您说您在问题中已经知道)。然后,您的第二个解决方案点P2
只需朝负BB
方向移动即可
P2 = (x2,y2) - K * BB