已知每个三角形的顶点坐标,和旋转的角度(顺时针),怎么得到旋转以后的每个三角形的新的坐标

Java语言编写多个三角形的旋转操作,能不能用三角函数的公式实现一个计算的方法么?总是提示缺少对象是什么原因?

如图

img

代码

import java.awt.geom.Point2D;

public class TriangleRotation {
    public static void main(String[] args) {
        // 定义三角形的顶点坐标
        Point2D.Double p1 = new Point2D.Double(0, 0);
        Point2D.Double p2 = new Point2D.Double(1, 0);
        Point2D.Double p3 = new Point2D.Double(0, 1);

        // 设置旋转角度(单位为弧度)
        double angle = Math.PI / 4; // 45度

        // 执行旋转操作
        rotateTriangle(p1, p2, p3, angle);

        // 输出旋转后的顶点坐标
        System.out.println("旋转后的顶点坐标:");
        System.out.println("p1: (" + p1.x + ", " + p1.y + ")");
        System.out.println("p2: (" + p2.x + ", " + p2.y + ")");
        System.out.println("p3: (" + p3.x + ", " + p3.y + ")");
    }

    public static void rotateTriangle(Point2D.Double p1, Point2D.Double p2, Point2D.Double p3, double angle) {
        // 计算三角形的中心点坐标
        double centerX = (p1.x + p2.x + p3.x) / 3;
        double centerY = (p1.y + p2.y + p3.y) / 3;

        // 对每个顶点进行旋转操作
        rotatePoint(p1, centerX, centerY, angle);
        rotatePoint(p2, centerX, centerY, angle);
        rotatePoint(p3, centerX, centerY, angle);
    }

    public static void rotatePoint(Point2D.Double point, double centerX, double centerY, double angle) {
        double cos = Math.cos(angle);
        double sin = Math.sin(angle);

        // 将顶点坐标平移到原点
        double translatedX = point.x - centerX;
        double translatedY = point.y - centerY;

        // 执行旋转操作
        double rotatedX = translatedX * cos - translatedY * sin;
        double rotatedY = translatedX * sin + translatedY * cos;

        // 将顶点坐标还原
        point.x = rotatedX + centerX;
        point.y = rotatedY + centerY;
    }
}


解析
你可以使用Math类提供的三角函数方法,比如Math.sin()和Math.cos()。
在进行旋转操作时,你需要定义一个三角形的顶点坐标,并选择一个旋转角度。然后,通过三角函数的公式计算新的顶点坐标。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7603881
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Java实现,在单链表中,含有三类字符的数据元素(如:字母、 数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只 含同一类的字符,且利用原表中的结点空间作为这三个表的空间。
  • 你还可以看下java参考手册中的 java-二维图形 - 如何在应用程序中显示和打印二维图形。-打印》教你如何向打印机渲染二维图形,打印复杂的文件,以及使用打印服务。-一个基本的打印程序
  • 您还可以看一下 徐无忌老师的Java进阶高手课-并发编程透彻理解课程中的 什么是多线程的上下文切换,有什么影响?如何进行优化?(二)小节, 巩固相关知识点
  • 除此之外, 这篇博客: 三门问题的理解和Java实现中的 但是我们可能还是不明白为什么换门就比不换门中奖概率高呢?以下我们可以用一些简单的数学推理来理解三门问题: 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题描述和背景信息:

    你想编写一个Java程序,用于计算给定每个三角形的顶点坐标和旋转角度后的新坐标。你想知道是否可以利用三角函数的公式来实现这个计算方法。然而,在尝试实现时,你遇到了缺少对象的错误提示。

    解决方案:

    在Java中,使用三角函数来进行旋转操作是可行的。下面是一种可以实现这一目标的方法:

    1. 创建一个Triangle类来表示三角形,其中包含三个顶点坐标的实例变量和一个旋转角度的实例变量。该类应该具有以下方法:
    public class Triangle {
        private Point vertex1;
        private Point vertex2;
        private Point vertex3;
        private double rotationAngle;
    
        public Triangle(Point vertex1, Point vertex2, Point vertex3, double rotationAngle) {
            this.vertex1 = vertex1;
            this.vertex2 = vertex2;
            this.vertex3 = vertex3;
            this.rotationAngle = rotationAngle;
        }
    
        public void rotate() {
            double centerX = (vertex1.getX() + vertex2.getX() + vertex3.getX()) / 3;
            double centerY = (vertex1.getY() + vertex2.getY() + vertex3.getY()) / 3;
    
            double sinTheta = Math.sin(Math.toRadians(rotationAngle));
            double cosTheta = Math.cos(Math.toRadians(rotationAngle));
    
            // 根据旋转公式更新每个顶点的坐标
            double newX1 = centerX + (vertex1.getX() - centerX) * cosTheta - (vertex1.getY() - centerY) * sinTheta;
            double newY1 = centerY + (vertex1.getX() - centerX) * sinTheta + (vertex1.getY() - centerY) * cosTheta;
    
            double newX2 = centerX + (vertex2.getX() - centerX) * cosTheta - (vertex2.getY() - centerY) * sinTheta;
            double newY2 = centerY + (vertex2.getX() - centerX) * sinTheta + (vertex2.getY() - centerY) * cosTheta;
    
            double newX3 = centerX + (vertex3.getX() - centerX) * cosTheta - (vertex3.getY() - centerY) * sinTheta;
            double newY3 = centerY + (vertex3.getX() - centerX) * sinTheta + (vertex3.getY() - centerY) * cosTheta;
    
            // 更新顶点坐标
            vertex1.setX(newX1);
            vertex1.setY(newY1);
    
            vertex2.setX(newX2);
            vertex2.setY(newY2);
    
            vertex3.setX(newX3);
            vertex3.setY(newY3);
        }
    
        // 省略getX和getY方法的定义
    }
    
    1. 创建一个Point类来表示坐标点,其中包含x和y坐标的实例变量和对应的getter和setter方法。示例代码如下:
    public class Point {
        private double x;
        private double y;
    
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    
        public double getX() {
            return x;
        }
    
        public void setX(double x) {
            this.x = x;
        }
    
        public double getY() {
            return y;
        }
    
        public void setY(double y) {
            this.y = y;
        }
    }
    
    1. 在主程序中,使用Triangle类进行旋转操作。示例代码如下:
    public class Main {
        public static void main(String[] args) {
            // 创建三个顶点对象
            Point vertex1 = new Point(1, 1);
            Point vertex2 = new Point(3, 1);
            Point vertex3 = new Point(2, 3);
    
            // 创建Triangle对象并指定旋转角度
            Triangle triangle = new Triangle(vertex1, vertex2, vertex3, 30);
    
            // 调用rotate方法进行旋转
            triangle.rotate();
    
            // 打印旋转后的顶点坐标
            System.out.println("Vertex 1: (" + vertex1.getX() + ", " + vertex1.getY() + ")");
            System.out.println("Vertex 2: (" + vertex2.getX() + ", " + vertex2.getY() + ")");
            System.out.println("Vertex 3: (" + vertex3.getX() + ", " + vertex3.getY() + ")");
        }
    }
    

    这个解决方案的关键在于在Triangle类的rotate方法中使用三角函数来计算旋转后的顶点坐标。这个方法首先计算三角形的中心点坐标,然后根据旋转公式更新每个顶点的新坐标。最后,可以在主程序中通过System.out.println语句打印旋转后的顶点坐标。

    这个解决方案中的代码片段是完全可行的,可以根据需要进行修改和优化。希望这可以帮助你解决问题。如果你有任何其他问题,请随时向我提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^