我有一个三角形,我知道两个顶点的坐标:A =(x1,y1),B =(x2,y2) 所有角度:ABC =90∘,CAB =30∘和BCA =60∘以及所有边长。如何找到第三个顶点的坐标C =(x3,y3)?
我知道有两种解决方案(我想要两种解决方案)。
答案 0 :(得分:4)
你得到了积分:
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
答案 1 :(得分:2)
在30-60-90的直角三角形中,最小的腿(与90度角相邻的最小边)的长度为斜边的1/2(与90度角相对的一侧),所以既然你有侧面长度,您可以确定哪条腿是线段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度(根据需要使用+ 30或-30) 并在角度a +/- 30处标记半径为x的圆(以A为中心)上的点C(我们在上面计算)。
然后,C有坐标
x3 = x1 + x * cos(a + 30)
y3 = y1 + x * sin(a + 30)
或者您可以使用(a-30)来获得对称三角形。
答案 2 :(得分:2)
如果提供两个点和边数作为输入,则返回完整多边形点的代码。 这是为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);
答案 3 :(得分:0)
这是一个直角三角形。角度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