Math 根据菱形',获取菱形边缘的X,Y坐标;宽度和角度

Math 根据菱形',获取菱形边缘的X,Y坐标;宽度和角度,math,processing,trigonometry,Math,Processing,Trigonometry,我正在画一个草图,给定一定的角度,在菱形的边缘画一个点 我知道菱形的宽度和位置,但我不知道如何计算位于其边缘的点的x-y坐标 对于这个问题有什么优雅的解决方案吗?伪代码方面的任何帮助都将受到欢迎。基于您的图像,您希望找到两个方程的交点,即角度θ处直线的交点和与之相交的正方形边的交点 假设正方形的大小为n,则正方形的方程式为y=±(n*(√2/2)±x(毕达哥拉斯定理)。您在图像中与之相交的一侧的方程式为y=n*(√2/2)-x 可以使用三角法计算径向线的方程,即y=tan(θ)*x,θ以弧度表示

我正在画一个草图,给定一定的角度,在菱形的边缘画一个点

我知道菱形的宽度和位置,但我不知道如何计算位于其边缘的点的x-y坐标


对于这个问题有什么优雅的解决方案吗?伪代码方面的任何帮助都将受到欢迎。

基于您的图像,您希望找到两个方程的交点,即角度θ处直线的交点和与之相交的正方形边的交点

假设正方形的大小为
n
,则正方形的方程式为
y=±(n*(√2/2)±x
(毕达哥拉斯定理)。您在图像中与之相交的一侧的方程式为
y=n*(√2/2)-x

可以使用三角法计算径向线的方程,即y=tan(θ)*x,θ以弧度表示

然后,您可以将其作为一个函数进行求解,以确定交点。请注意,它将与正方形的两侧(上方和下方)相交,因此如果您只想要一个,则必须为正方形的正确一侧选择方程式。还要注意θ是π/2的情况,因为tan(π/2)是未定义的。您可以很容易地计算出这种情况,因为x=0,所以它总是在
y=±(n)处相交*(√2/2))


在您的示例中,当
x*(1+tan(θ))=n时会发生交点*(√n/n)
,或
x=(n*(√n/n))/(1+tan(θ))
。你可以计算,把它插回y,这就是你的(x,y)交点

根据您的图像,您希望找到两个方程的交点,即角度θ处直线的交点和与之相交的正方形边的交点

假设正方形的大小为
n
,则正方形的方程式为
y=±(n*(√2/2)±x
(毕达哥拉斯定理)。您在图像中与之相交的一侧的方程式为
y=n*(√2/2)-x

可以使用三角法计算径向线的方程,即y=tan(θ)*x,θ以弧度表示

然后,您可以将其作为一个函数进行求解,以确定交点。请注意,它将与正方形的两侧(上方和下方)相交,因此如果您只想要一个,则必须为正方形的正确一侧选择方程式。还要注意θ是π/2的情况,因为tan(π/2)是未定义的。您可以很容易地计算出这种情况,因为x=0,所以它总是在
y=±(n)处相交*(√2/2))


在您的示例中,当
x*(1+tan(θ))=n时会发生交点*(√n/n)
,或
x=(n*(√n/n))/(1+tan(θ))
。你可以计算,把它插回y,这就是你的(x,y)交点

让我们把正方形边长设为
A
,一半长度设为
H=A/2
。角度
θ
。交点P.
所有坐标都是相对于正方形中心的

将正方形旋转
-Pi/4
,角度
α=θ-Pi/4

if Alpha lies in range -Pi/4..Pi/4, then intersection point P' = (H, H*Tan(Alpha))
if Alpha lies in range Pi/4..3*Pi/4, then P' = (H*Cotangent(Alpha), H)
if Alpha lies in range 3*Pi/4..5*Pi/4, then P' = (-H, -H*Tan(Alpha))
if Alpha lies in range 5*Pi/4..7*Pi/4, then P' = (-H*Cotangent(Alpha), -H)
然后将点
p'
向后旋转
Pi/4

S = Sqrt(2)/2
P.X = S * (P'.X - P'.Y)
P.Y = S * (P'.X + P'.Y)
示例(数据,如草图):


让我们把正方形边长设为
A
,一半长度设为
H=A/2
。角度
θ
。交点P.
所有坐标都是相对于正方形中心的

将正方形旋转
-Pi/4
,角度
α=θ-Pi/4

if Alpha lies in range -Pi/4..Pi/4, then intersection point P' = (H, H*Tan(Alpha))
if Alpha lies in range Pi/4..3*Pi/4, then P' = (H*Cotangent(Alpha), H)
if Alpha lies in range 3*Pi/4..5*Pi/4, then P' = (-H, -H*Tan(Alpha))
if Alpha lies in range 5*Pi/4..7*Pi/4, then P' = (-H*Cotangent(Alpha), -H)
然后将点
p'
向后旋转
Pi/4

S = Sqrt(2)/2
P.X = S * (P'.X - P'.Y)
P.Y = S * (P'.X + P'.Y)
示例(数据,如草图):


想象一个半径更大的圆在你想要的点上与你的菱形相交。在该位置绘制的一种方法是使用平移和旋转的嵌套坐标系。你只需要知道半径和角度

下面是一个非常基本的示例:

float angle = radians(-80.31);
float radius = 128; 

float centerX,centerY;
void setup(){
  size(320,320);
  noFill();
  rectMode(CENTER);

  centerX = width * 0.5;
  centerY = height * 0.5;
}
void draw(){
  background(255);
  noFill();
  //small circle
  strokeWeight(1);
  stroke(95,105,120);
  ellipse(centerX,centerY,210,210);
  rhombus(centerX,centerY,210);
  //large circle
  strokeWeight(3);
  stroke(95,105,120);
  ellipse(centerX,centerY,radius * 2,radius * 2);

  //line at angle
  pushMatrix();
    translate(centerX,centerY);
    rotate(angle);
    stroke(162,42,32);
    line(0,0,radius,0);
  popMatrix();

  //debug
  fill(0);
  text("angle: " + degrees(angle),10,15);
}
void rhombus(float x,float y,float size){
  pushMatrix();
  translate(x,y);
  rotate(radians(45));
  rect(0,0,size,size);
  popMatrix();
}
void mouseDragged(){
  angle = atan2(centerY-mouseY,centerX-mouseX)+PI;
}
您可以在此处尝试演示(您可以拖动鼠标更改角度):

var角;
var半径=128;
var centerX,centerY;
函数设置(){
createCanvas(320320);
noFill();
矩形模式(中心);
角度=弧度(-80.31);
中心x=宽度*0.5;
中心Y=高度*0.5;
}
函数绘图(){
背景(255);
noFill();
//小圆
冲程重量(1);
中风(95105120);
椭圆(centerX,centerY,210210);
菱形(centerX,centerY,210);
//大圆
冲程重量(3);
中风(95105120);
椭圆(中心x,中心y,半径*2,半径*2);
//斜线
推();
翻译(centerX、centerY);
旋转(角度);
中风(162,42,32);
直线(0,0,半径,0);
pop();
//调试
填充(0);
仰泳();
文本(“角度:+度(角度),10,15);
}
函数菱形(x,y,大小){
推();
翻译(x,y);
旋转(弧度(45));
rect(0,0,size,size);
pop();
}
函数mouseDragged(){
角度=atan2(centerY鼠标、centerX鼠标)+PI;
}

想象一个半径更大的圆,它将在你想要的点与你的菱形相交。在该位置绘制的一种方法是使用平移和旋转的嵌套坐标系。你只需要知道半径和角度

下面是一个非常基本的示例:

float angle = radians(-80.31);
float radius = 128; 

float centerX,centerY;
void setup(){
  size(320,320);
  noFill();
  rectMode(CENTER);

  centerX = width * 0.5;
  centerY = height * 0.5;
}
void draw(){
  background(255);
  noFill();
  //small circle
  strokeWeight(1);
  stroke(95,105,120);
  ellipse(centerX,centerY,210,210);
  rhombus(centerX,centerY,210);
  //large circle
  strokeWeight(3);
  stroke(95,105,120);
  ellipse(centerX,centerY,radius * 2,radius * 2);

  //line at angle
  pushMatrix();
    translate(centerX,centerY);
    rotate(angle);
    stroke(162,42,32);
    line(0,0,radius,0);
  popMatrix();

  //debug
  fill(0);
  text("angle: " + degrees(angle),10,15);
}
void rhombus(float x,float y,float size){
  pushMatrix();
  translate(x,y);
  rotate(radians(45));
  rect(0,0,size,size);
  popMatrix();
}
void mouseDragged(){
  angle = atan2(centerY-mouseY,centerX-mouseX)+PI;
}
您可以在此处尝试演示(您可以拖动鼠标更改角度):

var角;
var半径=128;
var centerX,centerY;
函数设置(){
createCanvas(320320);
noFill();
矩形模式(中心);
角度=弧度(-80.31);
中心x=宽度*0.5;
中心Y=高度*0.5;
}
函数绘图(){
背景(255);
noFill();
//小圆
冲程重量(1);
中风(95105120);
椭圆(centerX,centerY,210210);
菱形(centerX,centerY,210);
//大圆
冲程重量(3);
中风(95105120);
椭圆(中心x,中心y,半径*2,半径*2);
//斜线
推();
翻译(centerX、centerY);
旋转(角度);
中风(162,42,32);
直线(0,0,半径,0);
pop();
//调试
填充(0);
仰泳();
文本(“角度:+度(角度),10,15);
}
functi