Главная страница
Навигация по странице:

  • Тема: «Исследование математических методов представления и преобразования графических объектов на плоскости и в пространстве»

  • Задание на лабораторную работу Поворот объемного тела относительно осей координат на заданный угол.Теоретическая часть

  • Описание решения

  • Видео работы программы https://youtu.be/9hRcq0crwZQ Код программы

  • Компьютерная графика Лаб 1. 8371_ВасиковИван_Лаб1. Исследование математических методов представления и преобразования графических объектов на плоскости и в пространстве


    Скачать 496.57 Kb.
    НазваниеИсследование математических методов представления и преобразования графических объектов на плоскости и в пространстве
    АнкорКомпьютерная графика Лаб 1
    Дата24.10.2021
    Размер496.57 Kb.
    Формат файлаdocx
    Имя файла8371_ВасиковИван_Лаб1.docx
    ТипОтчет
    #254857

    МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ

    САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

    ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

    «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

    Кафедра САПР

    ОТЧЕТ

    по лабораторной работе №1

    по дисциплине «Компьютерная графика»

    Тема: «Исследование математических методов представления и преобразования графических объектов на плоскости и в пространстве»

    Студенты гр.8371: Васиков И.Р., Курышев Н.К.

    Преподаватель: Матвеева И.В.
    Санкт-Петербург
    2021

    Задание на лабораторную работу

    Поворот объемного тела относительно осей координат на заданный угол.

    Теоретическая часть



    Описание решения

    За основу взята фигура тетраэдр. Следующий программный год описывает параметры выбранной нами фигуры.

    tetrahedron = (Figure) new Figure(new Polyline[] {
    new Polyline(new Point[] {tetrahedronZero, tetrahedronFirst, tetrahedronSecond, tetrahedronZero, tetrahedronThird, tetrahedronSecond}),
    new Polyline(new Point[] {tetrahedronThird, tetrahedronFirst})
    }).movedXYZ(50,50,50);

    Point tetrahedronZero = new Point(0,0,0);
    Point
    tetrahedronFirst = tetrahedronZero.addedXYZ(100, 0, 0),
    tetrahedronSecond = tetrahedronZero.addedXYZ(100,0,0).rotatedXYZ(0,30,0),
    tetrahedronThird = new Point(50, 20.87, 81.65);

    Отсюда следует, что тетраэдр состоит из 4 точек, заданных следующими координатами:

    1-ая точка на (0, 0, 0)

    2-ая точка на (100, 0, 0)

    3-ья точка на (100, 0, 0) с поворотом на 30 градусов

    4-ая точка на (50, 20.87, 81.65)
    Поворот фигуры вокруг оси происходит с помощью умножения матриц:


    1. Матрица вращения по оси X

    private static double[][] rotatedAroundXData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {1,0,0, 0},
    {0, Math.cos(radians), -Math.sin(radians), 0},
    {0, Math.sin(radians), Math.cos(radians), 0},
    {0,0,0,1},
    };

    1. Матрица вращения по оси Y

    private static double[][] rotatedAroundYData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {Math.cos(radians), 0, Math.sin(radians), 0},
    {0,1,0, 0},
    {-Math.sin(radians), 0, Math.cos(radians), 0},
    {0,0,0,1}
    };
    }

    1. Матрица вращения по оси Z

    private static double[][] rotatedAroundZData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {Math.cos(radians), -Math.sin(radians), 0, 0},
    {Math.sin(radians), Math.cos(radians), 0, 0},
    {0,0,1, 0},
    {0,0,0, 1},
    };
    }

    Таким образом, при указании желаемой величины (в градусах) в специальном поле, происходит вращение тетраэдра по выбранной оси.

    Примеры работы программы

    1. Основное положение фигуры



    1. Вращение фигуры вокруг оси X на 50 градусов



    1. Вращение фигуры вокруг оси Y на 200 градусов



    1. Вращение вокруг оси Z на 60 градусов



    Видео работы программы

    https://youtu.be/9hRcq0crwZQ

    Код программы

    1. Класс Main.java.
      Отвечает за запуск класса MainFrame.java.

    package com.company;

    import com.company.widget.MainFrame;

    import javax.swing.*;

    public class Main {
    public static void main(String[] args) {
    MainFrame mainFrame = new MainFrame();
    mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    mainFrame.setVisible(true);
    }
    }

    1. Класс MainFrame.java.
      Отвечает за отрисовку всего окна приложения и выполнение логики программы.

    private static final double startXcent =440, startYcent =510, startZcent =0;
    private static final double startXdeg =185, startYdeg =240, startZdeg =0;
    private ViewPort vp;
    private final Container pane;
    private Figure tetrahedron;
    public MainFrame() {
    super();
    pane = this.getContentPane();
    JButton leftButton = new JButton("☚"),
    rightButton = new JButton("☛"),
    topButton = new JButton("☝"),
    bottomButton = new JButton("☟");
    leftButton.addActionListener(e -> {
    moveVp(-10, 0, 0);
    });
    rightButton.addActionListener(e -> {
    moveVp(10, 0, 0);
    });
    topButton.addActionListener(e -> {
    moveVp(0, -10, 0);
    });
    bottomButton.addActionListener(e -> {
    moveVp(0, 10, 0);
    });
    JButton
    rotateAroundXButton = new JButton("⤹"),
    rotateAroundYButton = new JButton("⤻"),
    rotateAroundZButton = new JButton("⤸");
    rotateAroundXButton.addActionListener(e -> {
    rotateVp(5, 0, 0);
    });
    rotateAroundYButton.addActionListener(e -> {
    rotateVp(0, 5, 0);
    });
    rotateAroundZButton.addActionListener(e -> {
    rotateVp(0, 0, 5);
    });
    JPanel controlPanel = new JPanel();
    controlPanel.setLayout(new BorderLayout());
    JPanel movePanel = new JPanel();
    movePanel.setLayout(new BorderLayout());
    movePanel.add(leftButton, BorderLayout.WEST);
    movePanel.add(rightButton, BorderLayout.EAST);
    movePanel.add(topButton, BorderLayout.NORTH);
    movePanel.add(bottomButton, BorderLayout.SOUTH);
    controlPanel.add(movePanel, BorderLayout.WEST);
    JPanel rotatePanel = new JPanel();
    rotatePanel.setLayout(new BorderLayout());
    rotatePanel.add(rotateAroundXButton, BorderLayout.WEST);
    rotatePanel.add(rotateAroundYButton, BorderLayout.CENTER);
    rotatePanel.add(rotateAroundZButton, BorderLayout.EAST);
    controlPanel.add(rotatePanel, BorderLayout.EAST);
    pane.add(controlPanel, BorderLayout.NORTH);
    JPanel rotateTetrahedronPanel = new JPanel();
    rotateTetrahedronPanel.setLayout(new BoxLayout(rotateTetrahedronPanel,BoxLayout.Y_AXIS));
    AtomicReference txDeg= new AtomicReference<>((double) 0);
    AtomicReference tyDeg= new AtomicReference<>((double) 0);
    AtomicReference tzDeg= new AtomicReference<>((double) 0);
    CoordinateField xCordfield = new CoordinateField("Вращение вокруг оси x", (s, o)->{
    double degToMove=Double.parseDouble(s) - txDeg.get();
    txDeg.set(Double.parseDouble(s));
    o.setText(String.valueOf(txDeg.get()));
    rotateTetrahedron(degToMove, 0 , 0);
    });
    CoordinateField yCordfield = new CoordinateField("Вращение вокруг оси y", (s, o)->{
    double degToMove=Double.parseDouble(s) - tyDeg.get();
    tyDeg.set(Double.parseDouble(s));
    o.setText(String.valueOf(tyDeg.get()));
    rotateTetrahedron(0, degToMove , 0);
    });
    CoordinateField zCordfield = new CoordinateField("Вращение вокруг оси z", (s, o)->{
    double degToMove=Double.parseDouble(s) - tzDeg.get();
    tzDeg.set(Double.parseDouble(s));
    o.setText(String.valueOf(tzDeg.get()));
    rotateTetrahedron(0, 0, degToMove );
    });
    rotateTetrahedronPanel.add(xCordfield);
    rotateTetrahedronPanel.add(yCordfield);
    rotateTetrahedronPanel.add(zCordfield);
    controlPanel.add(rotateTetrahedronPanel, BorderLayout.CENTER);
    Point zero = new Point(0,0,0);
    Polyline xAxis = new Polyline(new Point[]{zero, zero.addedXYZ(500,0,0)});
    Polyline yAxis = new Polyline(new Point[]{zero, zero.addedXYZ(0,500,0)});
    Polyline zAxis = new Polyline(new Point[]{zero, zero.addedXYZ(0,0,500)});
    Point tetrahedronZero = new Point(0,0,0);
    Point
    tetrahedronFirst = tetrahedronZero.addedXYZ(100, 0, 0),
    tetrahedronSecond = tetrahedronZero.addedXYZ(100,0,0).rotatedXYZ(0,30,0),
    tetrahedronThird = new Point(50, 20.87, 81.65);
    System.out.println(new Polyline(new Point[] {tetrahedronZero, tetrahedronFirst, tetrahedronSecond, tetrahedronZero, tetrahedronThird, tetrahedronSecond}).toString());
    tetrahedron = (Figure) new Figure(new Polyline[] {
    new Polyline(new Point[] {tetrahedronZero, tetrahedronFirst, tetrahedronSecond, tetrahedronZero, tetrahedronThird, tetrahedronSecond}),
    new Polyline(new Point[] {tetrahedronThird, tetrahedronFirst})
    }).movedXYZ(50,50,50);
    vp = new ViewPort(startXdeg, startYdeg, startZdeg).centeredXYZ(startXcent, startYcent, startZcent);
    vp.addItem(xAxis);
    vp.addItem(yAxis);
    vp.addItem(zAxis);
    vp.addItem(tetrahedron);
    pane.add(vp);
    }
    private void rotateTetrahedron(double xDeg, double yDeg, double zDeg) {
    Figure temp_tetrahedron = (Figure) tetrahedron.rotatedXYZ(xDeg,yDeg, zDeg);
    vp.redrawItem(tetrahedron, temp_tetrahedron);
    tetrahedron = temp_tetrahedron;
    this.repaint();
    this.revalidate();
    }
    private void moveVp(double xCent, double yCent, double zCent){
    pane.remove(1);
    vp = vp.centeredXYZ(xCent, yCent, zCent);
    pane.add(vp);
    pane.repaint();
    this.repaint();
    this.revalidate();
    }
    private void rotateVp(double xDeg, double yDeg, double zDeg){
    pane.remove(1);
    vp = vp.rotatedXYZ(xDeg, yDeg, zDeg);
    pane.add(vp);
    this.repaint();
    this.revalidate();

    1. Класс CoordinateField.java.
      Отвечает за виджет для ввода координат.

    public class CoordinateField extends JPanel {
    private final JTextField titleField, inputField, outputField;
    public CoordinateField(String title, BiConsumer onInputCoords) {
    super();
    super.setLayout(new BorderLayout());
    titleField = new JTextField(title);
    inputField = new JTextField();
    outputField = new JTextField();
    titleField.setEditable(false);
    outputField.setEditable(false);
    inputField.addActionListener((a)->onInputCoords.accept(inputField.getText(), outputField));
    super.add(titleField, BorderLayout.NORTH);
    super.add(inputField, BorderLayout.CENTER);
    super.add(outputField, BorderLayout.EAST);
    }
    }

    1. Класс RotationMatrix.java и Matrix.java.
      Отвечают за выполнение функций поворота и позиционирования объектов.

    public class RotationMatrix extends Matrix {
    private RotationMatrix(double[][] data)
    {
    super(data);
    }

    public static RotationMatrix rotatedAroundZ(double degrees) {
    return new RotationMatrix(rotatedAroundZData(degrees));
    }

    public static RotationMatrix rotatedAroundX(double degrees) {
    return new RotationMatrix(rotatedAroundXData(degrees));
    }

    public static RotationMatrix rotatedAroundY(double degrees) {
    return new RotationMatrix(rotatedAroundYData(degrees));
    }

    private static double[][] rotatedAroundZData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {Math.cos(radians), -Math.sin(radians), 0, 0},
    {Math.sin(radians), Math.cos(radians), 0, 0},
    {0,0,1, 0},
    {0,0,0, 1},
    };
    }
    private static double[][] rotatedAroundXData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {1,0,0, 0},
    {0, Math.cos(radians), -Math.sin(radians), 0},
    {0, Math.sin(radians), Math.cos(radians), 0},
    {0,0,0,1},
    };
    }

    private static double[][] rotatedAroundYData(double degrees) {
    double radians = Math.toRadians(degrees);
    return new double[][]{
    {Math.cos(radians), 0, Math.sin(radians), 0},
    {0,1,0, 0},
    {-Math.sin(radians), 0, Math.cos(radians), 0},
    {0,0,0,1}
    };
    }

    }

    public class Matrix {
    private final int width, height;
    private final double[][] data;
    public Matrix(double [][] data) {
    width = data[0].length;
    height = data.length;
    this.data = data.clone();
    }
    public Matrix summarized(Matrix other) {
    double [][] res_data = new double[this.height][other.width];
    if (this.width != other.width || this.height != other.height)
    {
    throw new ArithmeticException();
    }
    IntStream.range(0,this.height).forEach(
    (y)->res_data[y]=IntStream.range(0,this.width).mapToDouble(
    (x)->this.data[y][x]+other.data[y][x]
    ).toArray()
    );
    return new Matrix(res_data);
    }
    public Matrix multiplied(double d) {
    double[][] res_data = new double[this.height][this.width];
    IntStream.range(0, this.height).forEach((
    y)->res_data[y]=IntStream.range(0,this.width).mapToDouble(
    (x)->this.data[y][x]*d
    ).toArray()
    );
    return new Matrix(res_data);
    }

    public Matrix multiplied(Matrix other) {
    if (this.width != other.height)
    {
    throw new ArithmeticException();
    }
    double [][] res_data = new double[this.height][other.width];
    Object[] lines = IntStream.range(0, height)
    .mapToObj((y)->IntStream.range(0, other.width)
    .mapToDouble((x)->IntStream.range(0,width)
    .mapToDouble((k)->this.data[y][k]*other.data[k][x]
    ).sum()).toArray()
    ).toArray();
    for (int y = 0; y< lines.length; ++y)
    {
    res_data[y] = (double[]) lines[y];
    }
    return new Matrix(res_data);
    }

    public double[][] getData()
    {
    return data;
    }

    @Override
    public String toString() {
    StringBuilder sb = new StringBuilder();
    for (double[] line: data) {
    for (double d: line) {
    sb.append(d);
    sb.append('\t');
    }
    sb.append('\n');
    }
    return sb.toString();
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Matrix)) return false;
    Matrix matrix = (Matrix) o;
    return width == matrix.width &&
    height == matrix.height &&
    Arrays.equals(data, matrix.data);
    }

    @Override
    public int hashCode() {
    int result = Objects.hash(width, height);
    result = 31 * result + Arrays.hashCode(data);
    return result;
    }
    }

    1. Класс MovementMatrix.java

    Матрица перемещения. Используется для перемещения точек.

    public class MovementMatrix extends Matrix {

    private MovementMatrix(double[][] data) {
    super(data);
    }

    public static Matrix movedXYZ(double x, double y, double z) {
    return new MovementMatrix(new double[][]{
    {0, 0, 0, 0},
    {0, 0, 0, 0},
    {0, 0, 0, 0},
    {x, y, z, 0}
    }).summarized(new IdentityMatrix(4));
    }
    }

    1. Интерфейс Drawable.java.

    Отвечает за создание графических объектов.

    package com.company.geometry;

    import java.awt.*;

    public interface Drawable {
    void draw(Graphics g);
    }

    1. Класс Figure.java.

    Создан для удобства работы с несколькими Polylines.

    package com.company.geometry;

    import java.awt.*;
    import java.util.Arrays;
    import java.util.function.Consumer;
    import java.util.function.UnaryOperator;
    import java.util.stream.IntStream;

    public class Figure implements RotatableMoveableDrawable {
    private final Polyline[] polylines;

    public Figure(Polyline[] polylines) {
    this.polylines = polylines;
    }
    private Figure appliedToAllPolilines(UnaryOperator
    op){
    Polyline [] res_polylines = new Polyline[polylines.length];
    IntStream.range(0, polylines.length).forEach((i)->res_polylines[i]=op.apply(polylines[i]));
    return new Figure(res_polylines);
    }
    private void forEachPolyline(Consumer
    con) {
    Arrays.stream(polylines).forEach(con);
    }
    @Override
    public void draw(Graphics g) {
    forEachPolyline((p)->p.draw(g));
    }

    @Override
    public Moveable movedXYZ(double x, double y, double z) {
    return this.appliedToAllPolilines((p)-> (Polyline) p.movedXYZ(x,y,z));
    }

    @Override
    public Rotatable rotatedXYZ(double x, double y, double z) {
    return this.appliedToAllPolilines((p)->p.rotatedXYZ(x,y,z));
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Figure)) return false;
    Figure figure = (Figure) o;
    return Arrays.equals(polylines, figure.polylines);
    }

    @Override
    public int hashCode() {
    return Arrays.hashCode(polylines);
    }
    }

    1. Интерфейс Moveable.java.

    Отвечает за перемещение по осям X, Y, Z.

    package com.company.geometry;

    public interface Moveable {
    Moveable movedXYZ(double x, double y, double z);
    }

    1. Класс Point.java.

    Point является базовым классом для всех геометрических объектов.

    Изображает точку, которая не отображается на экране, т.к. не имеет метода draw. Тем не менее имеет свои координаты и может перемещаться методом addedXYZ, а также поворачиваться вокруг осей координат с помощью rotatedXYZ.

    public class Point{
    private final Matrix coords;
    public Point(double x,double y,double z) {
    this(new Matrix(new double[][]{{x, y, z, 1}}));
    }
    private Point(Matrix coords) {
    this.coords = coords;
    }
    public double getX() {
    return coords.getData()[0][0];
    }
    public double getY() {
    return coords.getData()[0][1];
    }
    public double getZ() {
    return coords.getData()[0][2];
    }
    public Point addedXYZ(double x, double y, double z)
    {
    Matrix new_cords = this.coords.multiplied(MovementMatrix.movedXYZ(x,y,z));
    System.out.println(new_cords);
    new_cords = new_cords.multiplied(1./new_cords.getData()[0][3]);
    System.out.println(new_cords);
    return new Point(new_cords);
    }

    @Override
    protected Object clone(){
    return new Point(this.getX(), this.getY(), this.getZ());
    }

    public Point rotatedXYZ(double xDeg, double yDeg, double zDeg){
    Matrix
    rotX= RotationMatrix.rotatedAroundX(xDeg),
    rotY= RotationMatrix.rotatedAroundY(yDeg),
    rotZ= RotationMatrix.rotatedAroundZ(zDeg);
    return new Point(this.coords.multiplied(rotX).multiplied(rotY).multiplied(rotZ));

    }
    @Override
    public String toString() {
    return String.format("(x:%s y:%s z:%s)", getX(), getY(), getZ());
    }
    }

    1. Класс Polyline.java.
      Отвечает за отображение линии между массивом точек. Имеет метод draw, а значит отображается на экране (Отображаются только оси x и y, z. Считается перпендикулярной экрану).

    public class Polyline implements RotatableMoveableDrawable {
    private final Point[] shape;
    public Polyline(Point[] shape) {
    this.shape = Arrays.copyOf(shape, shape.length);
    }
    private Polyline appliedToAllPoints(UnaryOperator
    op) {
    return new Polyline(Arrays.copyOf(Arrays.stream(shape).map(op).toArray(), shape.length, Point[].class));
    }

    @Override
    public Polyline rotatedXYZ(double xDeg, double yDeg, double zDeg) {
    return this.appliedToAllPoints((p)->p.rotatedXYZ(xDeg, yDeg, zDeg));
    }

    @Override
    public void draw(Graphics g) {
    IntStream.range(0, shape.length-1).forEach(
    (i)->{
    System.out.println("Drawing line"+shape[i]+shape[i+1]);
    g.drawLine((int)shape[i].getX(), (int)shape[i].getY(), (int)shape[i+1].getX(), (int)shape[i+1].getY());
    });
    }

    @Override
    public String toString() {
    return "Polyline: "+ Arrays.stream(shape).map(Point::toString).reduce((s1, s2)->s1+"-"+s2).orElse("");
    }

    @Override
    protected Object clone(){
    return new Polyline(this.shape);
    }

    @Override
    public Moveable movedXYZ(double x, double y, double z) {
    return this.appliedToAllPoints((p)->p.addedXYZ(x,y,z));
    }
    }


    1. Интерфейс Rotatable.java.

    Отвечает за вращение фигуры.

    package com.company.geometry;

    public interface Rotatable {
    Rotatable rotatedXYZ(double x, double y, double z);

    }

    1. Интерфейс RotatableMoveableDrawable.java.

    Отвечает за объединение трех перечисленных выше интерфейс для большего удобства.

    package com.company.geometry;

    import com.company.geometry.Drawable;
    import com.company.geometry.Moveable;
    import com.company.geometry.Rotatable;

    public interface RotatableMoveableDrawable extends Rotatable, Moveable, Drawable {
    }

    1. Класс ViewPort.java.
      Отвечает за рисование всей картинки целиком, предоставляет объект Graphics - холст для рисования фигур.

    public class ViewPort extends JComponent {
    private final double xDeg;
    private final double yDeg;
    private final double zDeg;
    private final double xCent;
    private final double yCent;
    private final double zCent;

    private List items = new LinkedList<>();
    public ViewPort(double xDeg, double yDeg, double zDeg) {
    this(xDeg, yDeg, zDeg, 0, 0, 0, new LinkedList<>());
    }
    private ViewPort(double xDeg, double yDeg, double zDeg, double xCent, double yCent, double zCent, List items) {
    this.xDeg = xDeg;
    this.yDeg = yDeg;
    this.zDeg = zDeg;
    this.xCent = xCent;
    this.yCent = yCent;
    this.zCent = zCent;
    this.items = items;
    }
    public ViewPort appliedToAllItems(UnaryOperator op) {
    ViewPort res = (ViewPort) this.clone();
    res.items = res.items.stream().map(op).collect(Collectors.toList());
    return res;
    }

    private void forEachItem(Consumer con) {
    items.forEach(con);
    }

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println("painting viewport");
    Rectangle clipBounds = g.getClipBounds();
    g.clearRect(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
    forEachItem((item)->((RotatableMoveableDrawable) ((RotatableMoveableDrawable) item.rotatedXYZ(xDeg, yDeg,zDeg)).movedXYZ(xCent, yCent, zCent)).draw(g));
    }
    public void addItem(RotatableMoveableDrawable item) {
    items.add(item);
    repaint();
    }

    public void redrawItem(RotatableMoveableDrawable toRedraw, RotatableMoveableDrawable redrawResult) {
    if (items.remove(toRedraw)) {
    addItem(redrawResult);
    }
    }

    @Override
    protected Object clone(){
    return new ViewPort(this.xDeg, this.yDeg, this.zDeg, this.xCent, this.yCent, this.zCent, this.items);
    }

    public ViewPort centeredXYZ(double xCent, double yCent, double zCent) {
    return new ViewPort(this.xDeg, this.yDeg, this.zDeg, this.xCent+xCent, this.yCent+yCent, this.zCent+zCent, this.items);
    }

    public ViewPort rotatedXYZ(double xDeg, double yDeg, double zDeg) {
    return new ViewPort(this.xDeg+xDeg, this.yDeg+yDeg, this.zDeg+zDeg, this.xCent, this.yCent, this.zCent, this.items);
    }
    public final double getRotationAroundX()
    {
    return xDeg;
    }
    public double getRotationAroundY()
    {
    return yDeg;
    }
    public double getRotationAroundZ()
    {
    return zDeg;
    }
    }

    Вывод

    В ходе работы были рассмотрены методы поворота объемного тела относительно осей координат на заданный угол. И была реализована программа, позволяющая выполнить данные методы.


    написать администратору сайта