Mor*_*eth 4 java rotation points
我对6点的轮换感到不满.这些点围绕中间的中心点旋转.但是会发生的是形状区域缩小,变得越来越小.
形状的绘图在带有PaintComponent的i JPanel上进行.这意味着画布只支持整数定位,尽管我可以在双打中存储位置.
我使用Point2D.Double存储点位置I在每个函数调用时将所有点旋转1个deegre
我认为我对旋转的理解是缺乏的,我可以在一次调用中旋转360 deegre,或180,这样可以正常工作.但45 deegres或90将完全把我的点变成一条线(下图).
这个问题一直困扰着我一段时间,但一如既往,我确信有一个简单的解决方案.
这是旋转功能
@Override
public synchronized void rotatePoints(int move_x, int move_y) {
// TODO Auto-generated method stub
super.rotatePoints(move_x, move_y);
BottomPanel.appendText("Area of Polygon is: " + UtilClass.calculateAreaOfPolygon(points)+ "\n");
double degrees=1.0;
double radians = degrees * (double)(Math.PI / 180.0);
//GET THE CENTER POINT C
Point2D.Double center = UtilClass.getCenterOfPolygon(points);
//ITERATE THROUGH THE POINTS
Iterator<PointClass> itr = points.iterator();
while(itr.hasNext()) {
//GET THE POINT
PointClass point_class = itr.next();
//point_class = points.get(3);
//FIRST TRANSLATE THE DIFFERENCE
double x1 = point_class.point.x - center.x;
double y1 = point_class.point.y - center.y;
//APPLY ROTATION MATRIX
x1 = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));
//TRANSLATE BACK
point_class.point.setLocation(x1 + center.x, y1 + center.y);
//ADD THE DEEGRES TO POINT CLASS
point_class.angle += Math.toDegrees(radians);
}
}
Run Code Online (Sandbox Code Playgroud)
这是用于检索给定多边形的中心位置的代码
public synchronized static Point2D.Double getCenterOfPolygon(List<PointClass> points) {
//GETTING THE CENTER OF A COMPLEX POLYGON
double combined_x = 0;
double combined_y = 0;
Iterator<PointClass> itr = points.iterator();
while(itr.hasNext()) {
PointClass point_class = itr.next();
//ADD TO THE
combined_x += point_class.point.x;
combined_y += point_class.point.y;
}
double center_x = combined_x / (double)points.size();
double center_y = combined_y / (double)points.size();
return new Point2D.Double(center_x, center_y);
}
Run Code Online (Sandbox Code Playgroud)
这是一个形状的图片,其所有点顺时针旋转1 deegre

每次旋转后,我输出多边形的区域就是结果
这是一张形状的图片,在一次通话后顺时针方向旋转90度.它显然不想这样做.
我会很高兴任何建议或提示.

错误在于:
//APPLY ROTATION MATRIX
x1 = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));
Run Code Online (Sandbox Code Playgroud)
x1正在更新太早,这y1是基于新值x1而不是旧值计算的.
您可以将其更改为以下内容:
//APPLY ROTATION MATRIX
double temp;
temp = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));
x1 = temp;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |