Math 缺少坐标。基本三角学帮助
请参考我的快速图表附在下面 我要做的是,利用红点已知坐标的角度,得到黄点的坐标。假设每个黄点与x:50/y:250红点成直角(我想这就是它的名称)相距约20像素,如何获得它们的坐标 我相信这是非常基本的三角学,我应该使用Math.tan(),但他们在艺术学校没有教我们很多数学Math 缺少坐标。基本三角学帮助,math,coordinates,trigonometry,Math,Coordinates,Trigonometry,请参考我的快速图表附在下面 我要做的是,利用红点已知坐标的角度,得到黄点的坐标。假设每个黄点与x:50/y:250红点成直角(我想这就是它的名称)相距约20像素,如何获得它们的坐标 我相信这是非常基本的三角学,我应该使用Math.tan(),但他们在艺术学校没有教我们很多数学 这一次你实际上不需要触发器。只需使用坡度,或在x和y中进行更改 给定一条斜率为m=y/x的直线,垂直于该直线的直线具有斜率-1/m,或-x/y 红点之间的斜率m为-150/150,或-1/1。我注意到你正面的y指向下方 因
这一次你实际上不需要触发器。只需使用坡度,或在
x
和y
中进行更改
给定一条斜率为m=y/x
的直线,垂直于该直线的直线具有斜率-1/m
,或-x/y
红点之间的斜率m为-150/150
,或-1/1
。我注意到你正面的y
指向下方
因此,正斜率为1/1
。x和y的变化速度相同,变化量相同
一旦你知道了这一点,那么剩下的就很容易搞定了。由于它们是以45度角对齐的,45-45-90
三角形的边比是1:1:sqrt(2)
。因此,如果长度是20
,那么单个x和y的变化将是20/sqrt(2)
,或者大约是14
因此,您的两个黄点位于(36236)
,和(64264)
。如果直线未对齐到合适的程度,则必须使用arctan()
或类似工具,并获取直线与水平线之间的角度,以便计算x和y变化的比率
我希望我的答案不会太难理解。要了解更一般的解决方案,请参阅游吟诗人的答案
编辑:因为OP说下方的红点实际上是围绕上方的红点旋转的,所以我们需要一个更灵活的解决方案 我将把这个答案从游吟诗人那里引申出来,因为我也在做同样的事情。请在阅读我的文章时参考他的文章 1。 获取从原点(200100)到旋转点(50250)的矢量:
vector = (200 - 50, 100 - 250) = (150, -150)
vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)
vector = vector / length(vector)
= (150 / length(vector), 150 / length(vector))
~= (0.7071, 0.7071)
where
length(vector) = sqrt(150^2 + 150^2) ~= 212.2320
yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)
2。
通过交换x和y来旋转矢量,并对x求反以获得新矢量:
vector = (200 - 50, 100 - 250) = (150, -150)
vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)
vector = vector / length(vector)
= (150 / length(vector), 150 / length(vector))
~= (0.7071, 0.7071)
where
length(vector) = sqrt(150^2 + 150^2) ~= 212.2320
yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)
3。
从新向量中获取单位向量(长度为1):
vector = (200 - 50, 100 - 250) = (150, -150)
vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)
vector = vector / length(vector)
= (150 / length(vector), 150 / length(vector))
~= (0.7071, 0.7071)
where
length(vector) = sqrt(150^2 + 150^2) ~= 212.2320
yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)
4。
将单位向量乘以,得到长度为20的位移向量。
displacement_vector = vector * 20
= (0.7071 * 20, 0.7071 * 20)
= (14.1421, 14.1421)
5。
在旋转矢量(点)上加/减该矢量:
vector = (200 - 50, 100 - 250) = (150, -150)
vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150)
vector = vector / length(vector)
= (150 / length(vector), 150 / length(vector))
~= (0.7071, 0.7071)
where
length(vector) = sqrt(150^2 + 150^2) ~= 212.2320
yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254)
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236)
我希望以上步骤能帮助您制定代码。不管它的角度是什么,都是相同的步数。如果你知道它将保持在45度,那就很容易了。如果距离50、250是20,则点位于
(50-(20*sqrt(2))、250-(20*sqrt(2))
和(50+(20/sqrt(2))、250+(20/sqrt(2)))
通常,每个的20*sqrt(2)
部分应替换为(距离)*cos(角度)
和距离*sin(角度)
。一个用于x坐标,一个用于y坐标。(取决于从哪一侧测量角度!)
总之,您应该使用sin和cos。45度是一种特殊情况,其中正余弦和余弦都是
1/sqrt(2)
,因此无论您使用它们的哪一个方向。由于黄点与红线成直角,因此您可以使用更简单的方法。我不会回答整个问题,但我会尝试给出一些线索:
忽略到黄点的实际距离,想象同一条西北-东南线上的其他点,与东北红点的距离相同。它的矢量就是红点的矢量,旋转90度
通过交换坐标并反转其中一个坐标,可以旋转90度
一旦你有了这个,通过按实际距离(20)缩放该向量,将那个黄点移动到更近的位置。称红点为(50250)A,称红点为(200100)B
一种方法是首先计算向量AB,即
v_AB = ( 200 - 50, 100 - 250 ) = ( 150, -150 )
通过交换组件并反转其中一个组件的符号,可以生成与该组件成直角的向量。所以
v_AB_perp = ( 150, 150 )
是一个矢量,当你们在屏幕上看到它时,它是通过顺时针旋转v_AB来旋转的。你可以将其归一化得到一个单位向量,方法是除以幅值,即
v_AB_perp_normalised = v_AB_perp / |v_AB_perp|
要获得黄点,只需将其乘以20个像素,然后将其加/减到A的坐标上。这应该有效(我将只参考最左侧的黄点,但我们最终将获得两者的坐标):
d2
以及与最低红点的距离为20的事实,找到黄点的坐标m=(y1-y2)/(x1-x2)=(250-100)/(50-200)=150/-150=-1
对于2:
我们知道d1
(红点之间的线)垂直于d2
(红点和黄点之间的线),因此其斜率的乘积必须为-1
。因此,d2
的斜率为m=1
因此方程为:d2:y-250=x-50=>d2:y-x=200
对于3个:
所需的黄点位于线d2
,其到最低红点的距离为20
。求解方程组:
y - x = 200
(x - 50)^2 + (y - 250)^2 = 400
计算变得非常难看,但用mathematica解决它会得到:
{{x->35.8579,y->235.858},{x->64.1421,y->264.142}
这就是你的两个黄点所在
通过编程,您可以解决这样的问题