ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 多边形形状在旋转时收缩

2019-05-29 12:50:28  阅读:269  来源: 互联网

标签:java rotation points


我对6点的轮换感到不满.这些点围绕中间的中心点旋转.但是会发生的是形状区域缩小,变得越来越小.

形状的绘图在带有PaintComponent的i JPanel上进行.这意味着画布只支持整数定位,尽管我可以在双打中存储位置.

我使用Point2D.Double存储点位置
我在每个函数调用时将所有点旋转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);
    }
}

这是用于检索给定多边形的中心位置的代码

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);
}

这是一个形状的图片,其所有点顺时针旋转1 deegre

每次旋转后,我输出多边形的区域
这是结果

>多边形面积为:6290
>多边形面积为:6288
>多边形面积为:6286
>多边形面积为:6284
>多边形面积为:6283
>多边形面积为:6281

这是一张形状的图片,在一次通话后顺时针方向旋转90度.
它显然不想这样做.

我会很高兴任何建议或提示.

解决方法:

错误在于:

//APPLY ROTATION MATRIX
x1 = (x1 * Math.cos(radians)) - (y1 * Math.sin(radians));
y1 = (x1 * Math.sin(radians)) + (y1 * Math.cos(radians));

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;

标签:java,rotation,points
来源: https://codeday.me/bug/20190529/1178126.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有