用正弦和余弦绘制一个有角度的正方形

时间:2012-10-16 06:53:56

标签: java graphics drawing awt trigonometry

这是我第一次在论坛上发帖。但我想我会跳进去问...我试图画一个有x,y,宽度,高度和角度的矩形。我不想创建图形2D对象并使用变换。我认为这是一种效率低下的方法。我试图使用for循环绘制一个带有旋转的正方形以迭代到正方形宽度,在正方形高度处每次迭代绘制线条。我对trig的理解真的很缺乏......我现在的代码画了一个时髦的三角形。如果还有其他问题,请回答抱歉。如果您对我的编码有任何指示,我会喜欢一些更正或指针。

/编辑:抱歉没有问题。我需要知道如何使用正弦和余弦来绘制一个正方形或矩形,其旋转位于方形或矩形的左上角。通过使用sin和cos与角度来获得坐标(x1,y1),然后使用角度加上90度的sin和cos函数来获得(x2,y2)的坐标。使用计数器变量从左到右绘制线从上到下随角度变化。

for (int s = 0; s < objWidth; s++){

       int x1 = (int)(s*Math.cos(Math.toRadians(objAngle)));
       int y1 = (int)(s*Math.sin(Math.toRadians(objAngle)));

       int x2 = (int)((objWidth-s)*Math.cos(Math.toRadians(objAngle+90)));
       int y2 = (int)((objHeight+s)*Math.sin(Math.toRadians(objAngle+90)));

       b.setColor(new Color((int)gArray[s]));
       b.drawLine(objX+x1, objY+y1, objX+x2, objY+y2);

}

2 个答案:

答案 0 :(得分:1)

它被称为Rotation matrix。 如果你的线在旋转之前有以下坐标:

第1行:(0,0) - (0,高度)

第2行:(1,0) - (1,身高)

...

线宽:(宽度,0) - (宽度,高度)

然后应用旋转矩阵变换将帮助您:

for (int s = 0; s < objWidth; s++){
  int x1 = cos(angle)*s
  int y1 = sin(angle)*s

  int x2 = s * cos(angle) - objHeight * sin(angle)
  int y2 = s * sin(angle) + objHeight * cos(angle) 

//the rest of code
}

希望我没有犯错误。

答案 1 :(得分:0)

你的意思是“菱形”吗? http://en.wikipedia.org/wiki/Rhombus(只有站着,可以这么说)

如果是这样,你可以只绘制四条线,水平线在x中的差异为xdiff = height * tan(objAngle)。

这样你的菱形就会被点积分为

p1 = (objX,objY) (lower left corner)
p2 = (objX+xdiff,objY+height) (upper left corner)
p3 = (objX+xdiff+width,objY+height) (upper right corner)
p4 = (objX+xdiff+width,objY) (lower right corner)

您将从p1到p2到p3到p4绘制线条,然后再返回到p1。

或者你还有其他形状吗?