Math 缺少坐标。基本三角学帮助

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:50/y:250红点成直角(我想这就是它的名称)相距约20像素,如何获得它们的坐标

我相信这是非常基本的三角学,我应该使用Math.tan(),但他们在艺术学校没有教我们很多数学


这一次你实际上不需要触发器。只需使用坡度,或在
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)之间的直线方程
  • 通过使用直线方程
    d2
    以及与最低红点的距离为20的事实,找到黄点的坐标
  • 对于1

    求斜率:
    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}

    这就是你的两个黄点所在

    通过编程,您可以解决这样的问题