简体   繁体   English

如何围绕中心旋转三角形?

[英]How to rotate triangle around center?

I am drawing a triangle on canvas: 我正在画布上绘制一个三角形:

float x = 540;
float y = 960;
Path path = new Path();
path.moveTo(x, y);
path.lineTo(x+18, y+60);
path.lineTo(x-18, y+60);
path.lineTo(x, y);
canvas.drawPath(path, mPaint);

This canvas has another objects. 此画布还有另一个对象。 But I need to rotate only this triangle around center of this triangle on a random angle (between 0 and 360). 但是我只需要围绕该三角形的中心以任意角度(0到360之间)旋转该三角形。 How to implement it? 如何执行呢? How to get coordinates vertexes of a triangle after rotation? 旋转后如何获取三角形的坐标顶点?

Its simple math, if the center of the triangle is (x,y) and the center-vertex distace is A, the three vertex will be 简单的数学运算,如果三角形的中心是(x,y)且中心顶点距离是A,则三个顶点将是

-(A*Math.cos(angle),A*Math.sin(angle)) -(A * Math.cos(angle),A * Math.sin(angle))

-(A*Math.cos(angle+2*Math.PI/3),A*Math.sin(angle+2*Math.PI/3)) -(A * Math.cos(angle + 2 * Math.PI / 3),A * Math.sin(angle + 2 * Math.PI / 3))

-(A*Math.cos(angle-2*Math.PI/3),A*Math.sin(angle-2*Math.PI/3)) -(A * Math.cos(angle-2 * Math.PI / 3),A * Math.sin(angle-2 * Math.PI / 3))

I solve it by this way: 我通过这种方式解决:

float angle = (float) Math.toRadians(90); // Angle to rotate

// Size of triangle
final float height = 60;
final float width = 36;

// Display coordinates where triangle will be drawn
float centerX = 540;
float centerY = 960;

// Vertex's coordinates before rotating
float x1 = centerX;
float y1 = centerY - height / 2;
float x2 = centerX + width / 2;
float y2 = centerY + height / 2;
float x3 = centerX - width / 2;
float y3 = y2;

// Rotating
float x1r = (float) ((x1 - centerX) * Math.cos(angle) - (y1 - centerY) * Math.sin(angle) + centerX);
float y1r = (float) ((x1 - centerX) * Math.sin(angle) + (y1 - centerY) * Math.cos(angle) + centerY);

float x2r = (float) ((x2 - centerX) * Math.cos(angle) - (y2 - centerY) * Math.sin(angle) + centerX);
float y2r = (float) ((x2 - centerX) * Math.sin(angle) + (y2 - centerY) * Math.cos(angle) + centerY);

float x3r = (float) ((x3 - centerX) * Math.cos(angle) - (y3 - centerY) * Math.sin(angle) + centerX);
float y3r = (float) ((x3 - centerX) * Math.sin(angle) + (y3 - centerY) * Math.cos(angle) + centerY);

// Drawing
Path path = new Path();
path.moveTo(x1r, y1r);
path.lineTo(x2r, y2r);
path.lineTo(x3r, y3r);
path.lineTo(x1r, y1r);
canvas.drawPath(path, mPaint);

Thanks to Gimka and Nofate for help. 感谢Gimka和Nofate的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM