Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Поворот фигуры по часовой стрелке

Помогите вывести формулу для поворота фигуры на произвольный угол. У меня выходит одно уравнение с двумя неизвестными.
Ответ: SergioO, почитаю про матрицы. Сейчас я не знаю как работать с ними.
Вопрос: Поворот фигуры в игре

Пишу игру "Водопроводчик". Сделал поле, накидал на него своих фигур, но столкнулся с проблемой, что я не могу повернуть фигуру. Написал функцию, но она не правильно работает. В игре использую OpenGl. Как можно реализовать функцию поворота.
Собственно сам код:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//#include "stdafx.h"
//#include <time.h>
//#include <stdlib.h>
//#include  <GL/glut.h>
//#include "Field.h"
//
//
class Shape
    {
    protected:
        int x;
        int y;
    public:
        virtual void Draw() = 0;
        int getX(){ return x; }
        int getY(){ return y; }
        void setX(int X){ x = X; }
        void setY(int Y){ y = Y; }
        Shape()
        {
            
        }
        
    };
 
class Rect :
    public Shape
{
private:
    //int  x,y;
public:
    Rect(){ x = 500; y = 500; }
    int getX(){ return x; }
        int getY(){ return y; }
        void setX(int X){ x = X; }
        void setY(int Y){ y = Y; }
    Rect(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
    void Draw()
    {
            
            glRectf(getX(),getY(), getX()+60, getY()+100);
    }
    
 
    
    ~Rect(){};
};
 
 
 
class Angle :
    public Shape
{
private:
    
public:
    Angle(){ x = 500; y = 500; }
    int getX(){ return x; }
        int getY(){ return y; }
        void setX(int X){ x = X; }
        void setY(int Y){ y = Y; }
    Angle(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
    void Draw()
    {
            
            glRectf(getX(),getY(), getX()+60, getY()+80);
            glRectf(getX(),getY()+20, getX()+80, getY()+80);
    }
 
    ~Angle(){};
};
 
 
class Cross :
    public Shape
{
private:
    
public:
    Cross(){ x = 500; y = 500; }
    int getX(){ return x; }
        int getY(){ return y; }
        void setX(int X){ x = X; }
        void setY(int Y){ y = Y; }
    Cross(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
    void Draw()
    {
            //glColor3f(0.3,0.3,0.3);
            glRectf(getX(),getY(), getX()+60, getY()+100);
            glRectf(getX()-20,getY()+20, getX()+80, getY()+80);
    }
 
    ~Cross(){};
};
И вот ещё часть кода:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include  <GL/glut.h>
#include "Field.h"
#include "Sshape.h"
#define PI 3,14159265358979323846
Field F(8,6,100);
 
class Mas
{
    private:
        int n;
     Shape **shape; 
    public:
        int getX(int i)
        {
            return shape[i]->getX();
        }
 
        int getY(int i)
        {
            return shape[i]->getY();
        }
        void setX(int X,int i)
        {
            shape[i]->setX(X);
        }
        void setY(int Y,int i)
        {
            shape[i]->setY(Y);
        }
        int getN(){return n;}
        void draw(int i)
        {
            shape[i]->Draw();
        }
 
    Mas()
    {
        
    n = 16;
    shape = new Shape*[n];
    shape[0] = new Rect(120,400);
    shape[1] = new Rect(220,400);
    shape[2] = new Rect(320,300);
    shape[3] = new Rect(520,100);
    shape[4] = new Rect(620,100);
    //
    shape[5] = new Angle(20,400);
    shape[6] = new Angle(320,500);
    shape[7] = new Angle(420,500);
    shape[8] = new Angle(420,400);
    shape[9] = new Angle(420,300);
    shape[10] = new Angle(520,300);
    shape[11] = new Angle(520,200);
    shape[12] = new Angle(320,200);
    shape[13] = new Angle(420,100);
    //
    shape[14] = new Cross(320,400);
    shape[15] = new Cross(420,200);
    
    
    }
    void  Draw()
    {
        glColor3f(0.3,0.3,0.3);
        for (int i = 0; i < n; i++)
        {
            shape[i]->Draw();
            
        }
    }
    ~Mas()
    {
        delete shape;
    }
    
};
Mas M;
 
void display() 
{
    glClear(GL_COLOR_BUFFER_BIT);
 
    DrawField(F);
    M.Draw();
    glFlush();
    glutSwapBuffers();
}
 
 
void Rotate(Mas *M, int i)
{
    float angle = (float)(PI/2);
    int radius;
    int point_angel;
    int sx,sy;
 
    sx = (M->getX(i) + 80)/2;
    sy = (M->getY(i) + 100)/2;
 
    radius = sqrt((float) sx*sx + sy*sy);
    point_angel = acosf((float) sx / radius);
    if(sy > 0) point_angel = -point_angel;
    M->setX((float)( radius * cosf(angle+point_angel) + sx),i);
    M->setY((float) (radius * sinf(angle+point_angel) + sy ),i);
 
 
}
 
void my_mouse(int button,int state,int x, int y)
{   
    
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {   
        cout << "X=" << x << "   " << "Y=" << y << endl; 
 
        
        for (int i = 0; i < M.getN(); i++)
        {   
            
            
            if (x >= M.getX(i) && x <= (M.getX(i) + 80) && y <= (F.getHeight() - M.getY(i))  && y >= (F.getHeight() - (M.getY(i) + 100))) 
            
            {
                //Rotate(&M,i);
                
            }
        }
    }
}
 
void timer(int = 0)
{
  display();   
 glutTimerFunc(50,timer,0);
}
 
int main(int argc, char **argv) {
    setlocale (LC_ALL,"Russian");
 
    srand(time(0));
    
 
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB );
glutInitWindowSize (F.getWeight(),F.getHeight() );
glutCreateWindow ("Test"); 
glClearColor(1.0,1.0,0.6,1.0);  //цвет фона
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,F.getWeight(),0,F.getHeight());
 
glutDisplayFunc (display);
glutMouseFunc(my_mouse);
//glutSpecialFunc(KeyboardEvent);
glutTimerFunc(50,timer,0);
 
glutMainLoop();
}
Ответ:
Сообщение от Progib8
Да, именно так и делал


Добавлено через 8 минут
И вообще мне непонятно, обычно сначала берут например треугольники, и пробуют поворачивать их отдельно… А затем поняв как это делать пробуют поворачивать например 10 треугольников. А уже потом пробуют текстуры сначала наложить потом двигать. А вы сразу за игру 0_0.Т.е. от простого к сложному а не наоборот.
Вопрос: перемещение,масштабирование,поворот фигуры

ошибок нет, фигура рисуется. если отдельно рассматривать каждое действие необходимое проводить над фигурой - все работает хорошо.. а как сделать чтоб корректно работал выбор действия и его выполнение - что-то не получается..помогите пожалуйста,как лучше поступить..я только учусь...и с первого раза редко чтоб что-то получалось
Код


 
#include "stdafx.h"
 
#include <windows.h>
#include<stdio.h>
#include <conio.h>
 
#include <glut.h>
 
#include <stdlib.h>
 
 
void figura()
    {  int w = 500;
    int h = 500;
    gluOrtho2D(-w,w,-h,h);
 
        glBegin(GL_LINE_LOOP);
 glColor3d(1,0,0);//krasnij
                glVertex2f( 40, 140);  
                 glColor3d(1,0,0);//krasnij
                 glVertex2f(60,180); 
                                glColor3d(1,0,0);//krasnij
                glVertex2f( 40,220);  
                 glColor3d(1,0,0);//krasnij
                glVertex2f(240,280);  
                 glColor3d(1,0,0);//krasnij
                glVertex2f( 240,80);
                    glColor3d(1,0,0);//krasnij
        glEnd();glFlush ();
 
            glBegin(GL_LINE_LOOP);
 glColor3d(1,0,0);//krasnij
                glVertex2f( 80, 80);  
                 glColor3d(1,0,0);//krasnij
                 glVertex2f(80,280); 
                                glColor3d(1,0,0);//krasnij
                glVertex2f( 280,220);  
                 glColor3d(1,0,0);//krasnij
                glVertex2f(260,180);  
                 glColor3d(1,0,0);//krasnij
                glVertex2f( 280,140);
                    glColor3d(1,0,0);//krasnij
        glEnd();glFlush ();
 
            glBegin(GL_LINE_LOOP);
 glColor3d(1,0,0);//krasnij
                glVertex2f( 160, 60);  
                 glColor3d(1,0,0);//krasnij
                 glVertex2f(60,180); 
                                glColor3d(1,0,0);//krasnij
                glVertex2f( 160,300);  
                 glColor3d(1,0,0);//krasnij
                glVertex2f(260,180);  
                 glColor3d(1,0,0);//krasnij
          
        glEnd();glFlush ();
}
 
void povorot()
{float x,y,ygol;
printf("Vvedite ygol povorota i po kakoj osi krytit' figyry:\n");
printf("ygol povorota="); scanf("%ygol", &ygol);
printf("os' x="); scanf("%x", &x);printf("\n");
printf("os' y="); scanf("%y", &y);printf("\n");glColor3d(1,0,0);//krasnij
glRotatef(ygol,x,y,0);
figura();
}
void masshtab()
{float mx,my;
    
printf("Yka*ite naskol'ko i po kakoj osi bydet proisxodit' mashtabirovanie:\n");
printf("os' x="); scanf("%mx", &mx);printf("\n");
printf("os' y="); scanf("%my", &my);printf("\n");glColor3d(1,0,0);//krasnij
glScalef(mx,my,0);
figura();
}
 
void peremeshenie()
{float px,py;
printf("Yka*ite naskol'ko i po kakoj osi bydet proisxodit' peremeshenie:\n");
printf("os' x="); scanf("%px", &px);printf("\n");
printf("os' y="); scanf("%py", &py);printf("\n");glColor3d(1,0,0);//krasnij
glTranslatef(px,py,0);
figura();
}
 
int main(int argc, char **argv)
{int n;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(500, 500);
    glutCreateWindow("lab2");
 
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //пространство координат
        
       glutDisplayFunc(figura);
        printf("Chto bydem delat' s figyroj?\n");
    printf("1.povorot\n");
    printf("2.masshtabirovanie\n");
    printf("3.peremeshenie\n");
    printf("0.vihod\n");
    scanf("%d",&n);printf("\n");
       switch (n)
       { case 1:glutDisplayFunc(povorot);    break;
       case 2:glutDisplayFunc(masshtab);     break;
       case 3:glutDisplayFunc(peremeshenie);break;
         case 0:exit(0);    
         default:printf("Nevernij re*im");  
        } 
      
    glutMainLoop();
 
    system("pause");
        
    return 0;
}

Ответ:

M
Rickert
Для домашних заданий, курсовых и т.п. существует \"Центр Помощи\".




Тема перенесена. 
Вопрос: Поворот фигуры в Delphi 7. Canvas


Первое уже сделал.

Вопрос в следующем. Может кто подсказать, что это за стандартные уравнения поворота точек? Заранее спасибо.
Ответ:
Сообщение от Puporev
Смотрите афинные преобразования на плоскости
Спасибо, вспомнил всё.
Вопрос: Не получается сделать поворот фигуры

Добрый день!

Не получается сделать квадратную спираль от самых краев к центру – каждый квадрат все меньше и меньше.

Вот код.

4 класса и класс для запуска приложения RobotManager

// 1 класс

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package Robot4;
 
import java.util.ArrayList;
import java.util.List;
 
public class Robot {
    
    private double x = 0;
    private double y = 0;
    protected double course = 0;
    
     // Список для хранения линий, по которым перемещался робот
    // Пока будем использовать его без подробностей n 
    private ArrayList<RobotLine> lines = new ArrayList<RobotLine>();
    
    //конструктор
    public Robot(double x, double y){
        this.x = x;
        this.y = y;
        
    }
 
     public void forward(int distanse){
         // Запоминаем координаты робота перед перемещением
         final double xOld=x;
         final double yOld=y;
         
        // Меняем координаты
        //звезда
        // x += distanse * Math.cos(course / 50 * Math.PI);
        // y += distanse * Math.sin(course / 50 * Math.PI);
         //спираль
         x += distanse * Math.cos(course/ 180 * Math.PI);
         y += distanse * Math.sin(course/ 180* Math.PI);
         
         // Запоминаем координаты пройденного пути в списке
         // Класс List позволяет добавить объект и хранить его
         
         lines.add(new RobotLine(xOld, yOld, x, y));
         
     }
     
  
     public double getX() {
         return x;
     }
  
     public double getY() {
         return y;
     }
  
     public double getCourse() {
         return course;
     }
     public void setCourse(double course) {
         this.course = course;
     }
    
  
     public ArrayList<RobotLine> getLines() {
         return lines;    
}    
}
// 2 класс

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Robot4;
 
import Robot4.Robot;
import javax.swing.JFrame;
 
 
public class RobotFrame extends JFrame {
 
            
        public RobotFrame(Robot robot) {
            // Устанавливаем заголовок окна
            setTitle("Robot Frame");
            // Добавляем компонент для рисования пути робота
            add(new RobotPathComponent(robot));
            // Устанавливаем размеры окна
            setBounds(100, 100, 500, 500);
 
        }
    
}
// 3 класс

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Robot4;
 
//Класс для хранения одной линии, которую проехал робот
public class RobotLine {
 
    private double x1;
    private double y1;
    private double x2;
    private double y2;
    
    //конструктор
    public RobotLine(double x1, double y1, double x2, double y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
    
    public double getX1() {
        return x1;
    }
 
    public double getY1() {
        return y1;
    }
 
    public double getX2() {
        return x2;
    }
 
    public double getY2() {
        return y2;
}
}
// 4 класс


Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package Robot4;
 
import Robot4.Robot;
import Robot4.RobotLine;
import java.awt.Graphics;
import javax.swing.JComponent;
 
public class RobotPathComponent extends JComponent {
 
    private Robot robot;
    
    public RobotPathComponent(Robot robot){
        this.robot = robot;
        
    }
    
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        
        // Перебираем все линии, которые сохранились у робота
        // Несколько позже мы разберем эту конструкицю подробно
        for (RobotLine rl : robot.getLines()) {
            // Для каждой линии получаем координаты
            int x1 = (int) Math.round(rl.getX1());
            int y1 = (int) Math.round(rl.getY1());
            int x2 = (int) Math.round(rl.getX2());
            int y2 = (int) Math.round(rl.getY2());
            // И рисуем линию с координатами
            g.drawLine(x1, y1, x2, y2);
        
        
        }
        
    }
    
}
// и класс для запуска

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package Robot4;
 
import Robot4.RobotFrame;
import javax.swing.JFrame;
 
 
public class RobotManager {
 
    
    public static void main(String[] args) {
        // Количество сторон многоугольника
         final int COUNT = 4;
         //final int COUNT = 9;//звезда
        // Длина стороны
        final int SIDE = 178;
        
         Robot robot = new Robot(100, 150);
           //  Создаем замкнутую фигуру с количеством углов COUNT
            for (int i = 0; i < COUNT;i++) {
                
                robot.forward(SIDE);
                        
                robot.setCourse(robot.getCourse() + 360 / COUNT);
              
           }
    
            // Создаем форму для отрисовки пути нашего робота
            RobotFrame rf = new RobotFrame(robot);
            rf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            rf.setVisible(true);
    }
 
}
Ответ: Кто поможет! Не получается
Вопрос: Отображение и движение фигуры

Помогите пожалуйста, почему не рисуется линия в PaintBox1? и как заставить эту линию двигаться по законам описанным в разделе MyClasses, все законы описал а как привести в действие не знаю

Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, MyClasses;
 
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;
 
var
  Form1: TForm1;
  MyLine1: TMyLine;
 
implementation
 
{$R *.dfm}
 
//создает форму
procedure TForm1.FormCreate(Sender: TObject);
begin
Width:=960;   //ширина формы
Height:=600;  //высота формы
MyLine1:=TMyLine.Create(270, ((PaintBox1.Left+PaintBox1.Width) div 2), ((PaintBox1.Left+PaintBox1.Height) div 2), ClBlack, (PaintBox1.Width div 2-20), 10);
end;
 
 
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
Show;  //отображает линию
Canvas.Rectangle(8,8,208,208); //рисует квадрат на ПаинтБоксе
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Timer1.Enabled:=true;//запускает таймер
 
end;
 
end.
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
unit MyClasses;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
 
type
  TZakon=class
  private
    { Private declarations }
  v:real; //скорость
  a:real; //ускорение
  s:real; //путь
  public
    { Public declarations }
  procedure FindSpeed(t:real); //Находит скорость
  procedure FindAcc(t:real);   //Находит ускорение
  procedure FindPut(t:real);   //Находит путь
  end;
//Класс Точка
type
  TMyPoint=class
  private
    { Private declarations }
    px:integer; // Координата Х точки
    py:integer; //Координата У точки
    cvet:TColor; //Цвет точки
  public
    { Public declarations }
    constructor Create(Newpx:integer; Newpy:integer; Newcvet:TColor);
end;
//Класс геометрическая фигура
type
  TGeometryFigure=class(TMyPoint)
  private
    { Private declarations }
  w:real; //Ширина фигуры
  h:real; //Высота фигуры
  ang:real; //Угол поворота фигуры
  x:integer; //Координата Х (докуда рисовать фигуру)
  y:integer; //Координата У (докуда рисовать фигуру)
  public
    { Public declarations }
    constructor Create(Newang:real; Newpx:integer; Newpy:integer; Newcvet:TColor; Neww:real; Newh:real);
end;
//Класс линия
type
  TMyLine=class(TGeometryFigure)
  Canvas:TCanvas;
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(Newang:real; Newpx:integer; Newpy:integer; Newcvet:TColor; Neww:real; Newh:real);
    procedure Show(); //отображает линию
  end;
 
implementation
 
 
{TZakon1}
procedure TZakon.FindAcc(t:real); //Находит ускорение
begin
a:=sin(t);
end;
 
procedure TZakon.FindPut(t:real); //Находит путь
begin
s:=t-sin(t);
end;
 
procedure TZakon.FindSpeed(t:real); //Находит Скорость
begin
v:=-cos(t)+1;
end;
 
{ TMyPoint }
 
constructor TMyPoint.Create(Newpx:integer; Newpy:integer; Newcvet:TColor);
  begin
    px:=Newpx;
    py:=Newpy;
    cvet:=Newcvet;
  end;
 
{ TGeometryFigure }
 
constructor TGeometryFigure.Create(Newang:real; Newpx:integer; Newpy:integer; Newcvet:TColor; Neww:real; Newh:real);
begin
    inherited Create(Newpx, Newpy, Newcvet);
    w:=Neww;
    h:=Newh;
    ang:=Newang;
    x:=round(px+w*cos(ang*pi/180)); //параметрическое уравнение для x
    y:=round(py+w*sin(ang*pi/180)); //параметрическое уравнение для y
end;
 
{ TMyLine }
 
constructor TMyLine.Create(Newang:real; Newpx:integer; Newpy:integer; Newcvet:TColor; Neww:real; Newh:real);
begin
end;
 
procedure TMyLine.Show(); //Рисует линию
begin
Canvas.MoveTo(px,py); //Откуда рисовать
Canvas.LineTo(x,y);   //докуда рисовать
end;
 
end.
Ответ: 1)
Сообщение от lucky_thi13en
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
Show; *//отображает линию
с чего бы Show отображает линию здесь?
если не указано, чей это Show, значит это Form.Show
если имелся в виду MyLine1.Show, тогда надо бы так и писать...

2)
Код Delphi
1
2
3
constructor TMyLine.Create(Newang:real; Newpx:integer; Newpy:integer; Newcvet:TColor; Neww:real; Newh:real);
begin
end;
как видно, это конструктор переопределяет создание для TMyLine, не вызывая никаких конструкторов своих предков
т.е. реально TMyLine.Create не происходит НИЧЕГО, кроме самого создания объекта TMyLine

3)
для того, чтобы БЫЛА какая-то анимация, нужно с какой-то периодичностью заставлять перерисовываться PainBox
тут для этого даже воткнут таймер. только код к нему никто не написал
в обработчике OnTimer достаточно PaintBox1.Invalidate;

4)
для того чтобы ВИДЕТЬ анимацию, она должна как-то менять координатки или что-то еще. Желательно тоже в таймере. Этого нигде не происходит

5)
ну и для чего классы TZakon и TPoryadok если нет класса TPonimanie? Все равно нигде они не используются

итого
в коде неправильно всё ((
--------------------------------

примеры анимации

Вопрос: Построить двумерное изображение заданной фигуры

Построить двумерное изображение заданной фигуры. Над фигурой выполнить все аффинные преобразования: перенос, отражение, масштабирование, поворот.

Помогите, пожалуйста написать программу! Само изображение во вложении.
Заранее спасибо!
Ответ: Я так понял что, исходя из картинки, афинные преобразования выполняются на плоскости. Зачем тогда третья координата точек, равная 1? И желательно определить координаты х, y всех вершин, поскольку из картинки не все понятно.
Если на плоскости, то так.
Почитайте это.
В этой книге со стр. 120 написано как делать афинные преобразования.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
uses graphABC,Crt;
const m=5;{фигура}
      n=3;{размер матриц коэффициентов}
type mas=array[1..m] of real;
     mtr=array[1..n,1..n] of real;
var xa,ya,xb,yb:mas;{фигуры после перемещения}
    a,r:mtr;{матрицы преобразований}
    xc,yc:integer;{центр экрана}
    ms:real;{масштаб для перевода реальных координат в экранные}
    i,j,k:byte;{счетчики циклов}
    c:char;{символ-команда}
procedure Osi;{рисование осей координат}
begin
setpencolor(clBlue);
line(0,yc,windowwidth,yc);{оси}
line(xc,0,xc,windowheight);
for i:=1 to 10 do{максимальное количество засечек в одну сторону}
if i mod 2=0 then
  begin
    line(xc-3,yc-round(i*ms),xc+3,yc-round(i*ms));{засечки на оси У}
    line(xc-3,yc+round(i*ms),xc+3,yc+round(i*ms));
    {подпись оси У}
    textout(xc-20,yc-round(i*ms),inttostr(i));{соответственно засечкам}
    textout(xc-25,yc+round(i*ms),inttostr(-i));
    line(xc+round(i*ms),yc-3,xc+round(i*ms),yc+3); {засечки на оси Х}
    line(xc-round(i*ms),yc-3,xc-round(i*ms),yc+3);
    {подпись оси Х}
    textout(xc+round(i*ms),yc+10,inttostr(i));
    textout(xc-round(i*ms),yc+10,inttostr(-i));
  end;
{центр}
textout(xc+5,yc+10,'0');
{подписи концов осей}
textout(windowwidth-20,yc-20,'X');
textout(xc+5,10, 'Y');
setpencolor(14);
textout(30,10,'Rotate - 1');
textout(30,30,'Stretching - 2');
textout(30,50,'Compression - 3');
textout(30,70,'MirrorX - 4');
textout(30,90,'MirrorY - 5');
textout(30,110,'MoveRight - 6');
textout(30,130,'MoveLeft - 7');
textout(30,150,'MoveUp - 8');
textout(30,170,'MoveDown - 9');
textout(30,190,'Exit - Esc');
end;
procedure Figura(x,y:mas);{рисование фигуры}
begin
Osi;
setpencolor(clRed);
setpenwidth(2);
moveto(xc+round(ms*x[1]),yc-round(ms*y[1]));
lineto(xc+round(ms*x[2]),yc-round(ms*y[2]));
lineto(xc+round(ms*x[3]),yc-round(ms*y[3]));
lineto(xc+round(ms*x[4]),yc-round(ms*y[4]));
lineto(xc+round(ms*x[5]),yc-round(ms*y[5]));
lineto(xc+round(ms*x[1]),yc-round(ms*y[1]));
end;
procedure Ed; { присвоение матрице R значения единичной }
begin
for i:=1 to n do
 begin                             {  1 0 0  }
  for j:=1 to n do  r[i,j]:=0;     {  0 1 0  }
  r[i,i]:=1;                       {  0 0 1  }
 end;
end;
procedure Mult; {умножение матриц А и R:  R = B = A*R }
var b:mtr;
    z:real;
begin
for i:=1 to n do
for j:=1 to n do
 begin
  z:=0;
  for k:=1 to n do
  z:=z+a[i,k]*r[k,j];
  b[i,j]:=z
 end;
for i:=1 to n do
for j:=1 to n do
r[i,j]:=b[i,j]
end;
procedure Stretch;  {расчет матриц А и R для растягивания фигуры}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 1.05  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=1.05;{коэффициент растяжения}
a[1,1]:=1.05;
Mult;
end;
procedure Compress;  {расчет матриц А и R для сжатия фигуры}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 1.05  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=0.95;{коэффициент растяжения}
a[1,1]:=0.95;
Mult;
end;
procedure MirrorX;  {расчет матриц А и R для отражения фигуры по Х}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 -1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=-1;
Mult;
end;
procedure MirrorY;  {расчет матриц А и R для отражения фигуры по Х}
begin
for i:=1 to n do
 begin                         { -1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0  1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[1,1]:=-1;
Mult;
end;
procedure MoveY(dy:integer);  {расчет матриц А и R для перемещения фигуры по Y}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0  1 dy  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,3]:=dy;
Mult;
end;
procedure MoveX(dx:integer);  {расчет матриц А и R для перемещения фигуры по Y}
begin
for i:=1 to n do
 begin                         {  1  0  dx }
  for j:=1 to n do a[i,j]:=0;  {  0  1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[1,3]:=dx;
Mult;
end;
procedure Rotate(u:real); {расчет матриц А и R для поворота  фигуры}
var c, s: real;                                                                               {---на угол alfa(рад)---}
begin                {  cos(u) -sin(u) 0  }
for i:=1 to 3 do     {  sin(u)  cos(u) 0  }
for j:=1 to 3 do     {   0       0     1  }
a[i,j]:=0;
a[3,3]:=1;
c:=cos(u);   a[1,1]:= c;  a[2,2]:=c;
s:=sin(u);   a[1,2]:=-s;  a[2,1]:=s;
Mult;
end;
 
procedure New_XY;{расчет новых координат фигуры по исходным}
begin           {с использованием матрицы преобразования R}
for i:=1 to m do
 begin
  xb[i]:=xa[i]*r[1, 1]+ ya[i]*r[1, 2]+ r[1, 3];
  yb[i]:=xa[i]*r[2, 1]+ ya[i]*r[2, 2]+ r[2, 3]
 end;
end;
 
 
begin
setwindowsize(500,500);
centerwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2; { центр экрана }
ms:=(yc-30)/10;
{зададим координаты вершин фмгуры}
xa[1]:=-3;ya[1]:=-1.5;
xa[2]:=-2;ya[2]:=3;
xa[3]:=2;ya[3]:=1.5;
xa[4]:=-1;ya[4]:=-1.5;
xa[5]:=-1;ya[5]:=0;
Figura(xa,ya);{исходный}
repeat
if keypressed then
 begin
  c:=readkey;
  case c of
  #49:begin
      clearwindow;
      Ed;
      Rotate(pi/3); {поворот на pi/4 относительно начала координат}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;{запомним новое положение}
      end;
  #50:begin
      clearwindow;
      Ed;
      Stretch; { растяжение}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #51:begin
      clearwindow;
      Ed;
      Compress; { сжатие}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #52:begin
      clearwindow;
      Ed;
      MirrorX; { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #53:begin
      clearwindow;
      Ed;
      MirrorY; { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #54:begin
      clearwindow;
      Ed;
      MoveX(1); { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #55:begin
      clearwindow;
      Ed;
      MoveX(-1); { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #56:begin
      clearwindow;
      Ed;
      MoveY(1); { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #57:begin
      clearwindow;
      Ed;
      MoveY(-1); { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #27:exit;
  end;
 end;
until c=#27;
end.
Добавлено через 9 часов 4 минуты
Для Турбо и Free Pascal
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
uses graphABC,Crt;
const m=5;{фигура}
      n=3;{размер матриц коэффициентов}
type mas=array[1..m] of real;
     mtr=array[1..n,1..n] of real;
var xa,ya,xb,yb:mas;{фигуры после перемещения}
    a,r:mtr;{матрицы преобразований}
    xc,yc:integer;{центр экрана}
    ms:real;{масштаб для перевода реальных координат в экранные}
    i,j,k:byte;{счетчики циклов}
    c:char;{символ-команда}
procedure Osi;{рисование осей координат}
begin
setpencolor(clBlue);
line(0,yc,windowwidth,yc);{оси}
line(xc,0,xc,windowheight);
for i:=1 to 10 do{максимальное количество засечек в одну сторону}
if i mod 2=0 then
  begin
    line(xc-3,yc-round(i*ms),xc+3,yc-round(i*ms));{засечки на оси У}
    line(xc-3,yc+round(i*ms),xc+3,yc+round(i*ms));
    {подпись оси У}
    textout(xc-20,yc-round(i*ms),inttostr(i));{соответственно засечкам}
    textout(xc-25,yc+round(i*ms),inttostr(-i));
    line(xc+round(i*ms),yc-3,xc+round(i*ms),yc+3); {засечки на оси Х}
    line(xc-round(i*ms),yc-3,xc-round(i*ms),yc+3);
    {подпись оси Х}
    textout(xc+round(i*ms),yc+10,inttostr(i));
    textout(xc-round(i*ms),yc+10,inttostr(-i));
  end;
{центр}
textout(xc+5,yc+10,'0');
{подписи концов осей}
textout(windowwidth-20,yc-20,'X');
textout(xc+5,10, 'Y');
setpencolor(14);
textout(30,10,'Rotate - 1');
textout(30,30,'Stretching - 2');
textout(30,50,'Compression - 3');
textout(30,70,'MirrorX - 4');
textout(30,90,'MirrorY - 5');
textout(30,110,'MoveRight - 6');
textout(30,130,'MoveLeft - 7');
textout(30,150,'MoveUp - 8');
textout(30,170,'MoveDown - 9');
textout(30,190,'Exit - Esc');
end;
procedure Figura(x,y:mas);{рисование фигуры}
begin
Osi;
setpencolor(clRed);
setpenwidth(2);
moveto(xc+round(ms*x[1]),yc-round(ms*y[1]));
lineto(xc+round(ms*x[2]),yc-round(ms*y[2]));
lineto(xc+round(ms*x[3]),yc-round(ms*y[3]));
lineto(xc+round(ms*x[4]),yc-round(ms*y[4]));
lineto(xc+round(ms*x[5]),yc-round(ms*y[5]));
lineto(xc+round(ms*x[1]),yc-round(ms*y[1]));
end;
procedure Ed; { присвоение матрице R значения единичной }
begin
for i:=1 to n do
 begin                             {  1 0 0  }
  for j:=1 to n do  r[i,j]:=0;     {  0 1 0  }
  r[i,i]:=1;                       {  0 0 1  }
 end;
end;
procedure Mult; {умножение матриц А и R:  R = B = A*R }
var b:mtr;
    z:real;
begin
for i:=1 to n do
for j:=1 to n do
 begin
  z:=0;
  for k:=1 to n do
  z:=z+a[i,k]*r[k,j];
  b[i,j]:=z
 end;
for i:=1 to n do
for j:=1 to n do
r[i,j]:=b[i,j]
end;
procedure Stretch;  {расчет матриц А и R для растягивания фигуры}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 1.05  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=1.05;{коэффициент растяжения}
a[1,1]:=1.05;
Mult;
end;
procedure Compress;  {расчет матриц А и R для сжатия фигуры}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 1.05  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=0.95;{коэффициент растяжения}
a[1,1]:=0.95;
Mult;
end;
procedure MirrorX;  {расчет матриц А и R для отражения фигуры по Х}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0 -1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,2]:=-1;
Mult;
end;
procedure MirrorY;  {расчет матриц А и R для отражения фигуры по Х}
begin
for i:=1 to n do
 begin                         { -1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0  1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[1,1]:=-1;
Mult;
end;
procedure MoveY(dy:integer);  {расчет матриц А и R для перемещения фигуры по Y}
begin
for i:=1 to n do
 begin                         {  1  0  0  }
  for j:=1 to n do a[i,j]:=0;  {  0  1 dy  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[2,3]:=dy;
Mult;
end;
procedure MoveX(dx:integer);  {расчет матриц А и R для перемещения фигуры по Y}
begin
for i:=1 to n do
 begin                         {  1  0  dx }
  for j:=1 to n do a[i,j]:=0;  {  0  1  0  }
  a[i,i]:=1;                   {  0  0  1  }
 end;
a[1,3]:=dx;
Mult;
end;
procedure Rotate(u:real); {расчет матриц А и R для поворота  фигуры}
var c, s: real;                                                                               {---на угол alfa(рад)---}
begin                {  cos(u) -sin(u) 0  }
for i:=1 to 3 do     {  sin(u)  cos(u) 0  }
for j:=1 to 3 do     {   0       0     1  }
a[i,j]:=0;
a[3,3]:=1;
c:=cos(u);   a[1,1]:= c;  a[2,2]:=c;
s:=sin(u);   a[1,2]:=-s;  a[2,1]:=s;
Mult;
end;
 
procedure New_XY;{расчет новых координат фигуры по исходным}
begin           {с использованием матрицы преобразования R}
for i:=1 to m do
 begin
  xb[i]:=xa[i]*r[1, 1]+ ya[i]*r[1, 2]+ r[1, 3];
  yb[i]:=xa[i]*r[2, 1]+ ya[i]*r[2, 2]+ r[2, 3]
 end;
end;
 
 
begin
setwindowsize(500,500);
centerwindow;
xc:=windowwidth div 2;
yc:=windowheight div 2; { центр экрана }
ms:=(yc-30)/10;
{зададим координаты вершин фмгуры}
xa[1]:=-3;ya[1]:=-1.5;
xa[2]:=-2;ya[2]:=3;
xa[3]:=2;ya[3]:=1.5;
xa[4]:=-1;ya[4]:=-1.5;
xa[5]:=-1;ya[5]:=0;
Figura(xa,ya);{исходный}
repeat
if keypressed then
 begin
  c:=readkey;
  case c of
  #49:begin
      clearwindow;
      Ed;
      Rotate(pi/3); {поворот на pi/4 относительно начала координат}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;{запомним новое положение}
      end;
  #50:begin
      clearwindow;
      Ed;
      Stretch; { растяжение}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #51:begin
      clearwindow;
      Ed;
      Compress; { сжатие}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #52:begin
      clearwindow;
      Ed;
      MirrorX; { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #53:begin
      clearwindow;
      Ed;
      MirrorY; { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #54:begin
      clearwindow;
      Ed;
      MoveX(1); { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #55:begin
      clearwindow;
      Ed;
      MoveX(-1); { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #56:begin
      clearwindow;
      Ed;
      MoveY(1); { отражение по Х}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #57:begin
      clearwindow;
      Ed;
      MoveY(-1); { отражение по Y}
      New_XY;
      Figura(xb,yb);
      xa:=xb;ya:=yb;
      end;
  #27:exit;
  end;
 end;
until c=#27;
end.
Вопрос: Вращение фигуры мышью

Подскажите, как сделать что бы данная фигура вращалась при помощи мыши. Делал в Lazarus
Ответ:
Сообщение от Helldrake
как сделать что бы данная фигура вращалась при помощи мыши.
Находить координаты мышки в 2д и преобразовывать их в координаты камеры по сферической системе координат(если поворот камеры вокруг Z). Или поворот камеры вокруг произвольной оси тогда через матрицу поворота вокруг произвольной оси ( в википедии она есть, но это человеку неудобно и странно =)) ). Или также вращать фигуру а не камеру…
Вопрос: Поворот изображения на 90 градусов

Помогите, пожалуйста, сделать поворот изображений при нажатии определенной клавиши.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
program project9_1;
 
uses crt, graph;
 
var gd, gm: smallint;
 
procedure MoveRect;
var x,y,x1,y1:integer;
    c2:byte;
    k:char;
    move:boolean;
begin
x:=280;
y:=200;
c2:=0;
move:=true;
repeat
if keypressed then
  begin
    k:=readkey;
    if (k=#83)or(k=#115)or(k=#155)or(k=#235) then  //вниз
      begin
        y1:=y;
        x1:=x;
        y:=y+5;
        move:=true;
      end;
    if (k=#87)or(k=#119)or(k=#150)or(k=#230) then   //вверх
      begin
        y1:=y;
        x1:=x;
        y:=y-5;
        move:=true;
      end;
    if (k=#68)or(k=#100)or(k=#130)or(k=#162) then   //вправо
      begin
        y1:=y;
        x1:=x;
        x:=x+5;
        move:=true;
      end;
    if(k=#65)or(k=#97)or(k=#148)or(k=#228) then    //влево
      begin
        y1:=y;
        x1:=x;
        x:=x-5;
        move:=true;
      end;
  end;
if move then
  begin
    cleardevice;
    Setcolor(c2);
    Setcolor(blue);
    Rectangle(x,y,x+20,y+20);
    Setcolor(red);
    Rectangle(x-20,y,x,y+20);
    Setcolor(green);
    Rectangle(x-20,y+20,x,y+40);
    Setcolor(yellow);
    Rectangle(x-20,y+40,x,y+60);
    Setcolor(12);                     //прямоугольник
    Rectangle(x+40,y,x+70,y+60);
    move:=false;
  end;
until k=#27;
end;
 
begin
gd:=detect;
Initgraph(gd,gm,'');
MoveRect;
end.
Добавлено через 3 часа 2 минуты
Поворот влево или вправо не имеет значения, главное, чтобы она повернулась��
Ответ: Вот пример движения и поворота.
Используются по первых 5 буквенных клавиш слева в 1 и 2 ряду сверху.
Проверки на пересечение фигур нет, долго нужно все варианты рассматривать.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
uses wincrt,graph;
type mas=array[1..10] of pointtype;
const n1=5;
      n2=10;
{прямоугольник}
procedure R(p:mas;c:integer);
var i:byte;
begin
setcolor(c);
setfillstyle(1,c);
fillpoly(n1,p);
end;
{Г-образная фигура}
procedure G(var p:mas;c1,c2:integer);
begin
setcolor(c1);
setfillstyle(1,c1);
fillpoly(n2,p);
setcolor(c2);
rectangle(p[1].x,p[1].y,p[6].x,p[6].y);
rectangle(p[1].x,p[1].y,p[3].x,p[3].y);
line(p[5].x,p[5].y,p[8].x,p[8].y);
end;
{движение влево}
procedure left(var p:mas;n:integer);
var i:integer;
begin
for i:=1 to n do
p[i].x:=p[i].x-5;
end;
{движение вправо}
procedure right(var p:mas;n:integer);
var i:integer;
begin
for i:=1 to n do
p[i].x:=p[i].x+5;
end;
{движение вверх}
procedure up(var p:mas;n:integer);
var i:integer;
begin
for i:=1 to n do
p[i].y:=p[i].y-5;
end;
{движение вниз}
procedure down(var p:mas;n:integer);
var i:integer;
begin
for i:=1 to n do
p[i].y:=p[i].y+5;
end;
{поворот на 90 градусов по часовой стрелке и против}
procedure p90(var p:mas;x,y,n:integer;u:real);
var t:pointtype;
    i:byte;
begin
for i:=1 to n do
 begin
  t.x:=x+round((p[i].x-x)*cos(u)-(p[i].y-y)*sin(u));
  t.y:=y+round((p[i].x-x)*sin(u)+(p[i].y-y)*cos(u));
  p[i]:=t;
 end;
end;
function mxX(p:mas;n:integer):integer;
var i,mx:integer;
begin
mx:=p[1].x;
for i:=2 to n do
if p[i].x>mx then mx:=p[i].x;
mxX:=mx;
end;
function mxY(p:mas;n:integer):integer;
var i,mx:integer;
begin
mx:=p[1].y;
for i:=2 to n do
if p[i].y>mx then mx:=p[i].y;
mxY:=mx;
end;
function mnX(p:mas;n:integer):integer;
var i,mn:integer;
begin
mn:=p[1].x;
for i:=2 to n do
if p[i].x<mn then mn:=p[i].x;
mnX:=mn;
end;
function mnY(p:mas;n:integer):integer;
var i,mn:integer;
begin
mn:=p[1].y;
for i:=2 to n do
if p[i].y<mn then mn:=p[i].y;
mnY:=mn;
end;
var x1,y1,x2,y2,a,i:integer;
    p1,p2:mas;
    c:char;
begin
initgraph(x1,y1,'');
outtextXY(10,0,'Upravlenie:');
outtextXY(10,20,'rectangle: Q,q-left W,w-up E,e-right R,r-down T,t-rotate');
outtextXY(10,40,'ugol:      A,a-left S,s-up D,d-right F,f-down G,g-rotate');
outtextXY(10,60,'exit-Escape');
a:=30;
x1:=getmaxX div 3;
y1:=getmaxY div 2;
x2:=2*x1;
y2:=y1;
p1[1].x:=x1;     p1[1].y:=y1;
p1[2].x:=x1+2*a; p1[2].y:=y1;
p1[3].x:=x1+2*a; p1[3].y:=y1+3*a;
p1[4].x:=x1;     p1[4].y:=y1+3*a;
p1[5]:=p1[1];
p2[1].x:=x2; p2[1].y:=y2;
p2[2].x:=x2+2*a; p2[2].y:=y2;
p2[3].x:=x2+2*a; p2[3].y:=y2+a;
p2[4].x:=x2+a;   p2[4].y:=y2+a;
p2[5].x:=x2+a;   p2[5].y:=y2+2*a;
p2[6].x:=x2+a;   p2[6].y:=y2+3*a;
p2[7].x:=x2;     p2[7].y:=y2+3*a;
p2[8].x:=x2;     p2[8].y:=y2+2*a;
p2[9].x:=x2;     p2[9].y:=y2+a;
p2[10]:=p2[1];
G(p2,10,12);
R(p1,13);
repeat
c:=readkey;
case c of
#81,#113:if mnX(p1,n1)>5 then
         begin
          delay(50);
          R(p1,0);
          left(p1,n1);
          R(p1,13);
         end;
#87,#119:if mnY(p1,n1)>75 then
         begin
          delay(50);
          R(p1,0);
          up(p1,n1);
          R(p1,13);
         end;
#69,#101:if mxX(p1,n1)<getmaxX-5 then
         begin
          delay(50);
          R(p1,0);
          right(p1,n1);
          R(p1,13);
         end;
#82,#114:if mxY(p1,n1)<getmaxY-5 then
         begin
          delay(50);
          R(p1,0);
          down(p1,n1);
          R(p1,13);
         end;
#84,#116:begin
         delay(50);
         R(p1,0);
         p90(p1,x1,y1,n1,pi/2);
         R(p1,13);
         end;
 
 
#65,#97:if mnX(p2,n2)>5 then
         begin
          delay(50);
          G(p2,0,0);
          left(p2,n2);
          G(p2,10,12);
         end;
#83,#115:if mnY(p2,n2)>75 then
         begin
          delay(50);
          G(p2,0,0);
          up(p2,n2);
          G(p2,10,12);
         end;
#68,#100:if mxX(p2,n2)<getmaxX-5 then
         begin
          delay(50);
          G(p2,0,0);
          right(p2,n2);;
          G(p2,10,12);
         end;
#70,#102:if mxY(p2,n2)<getmaxY-5 then
         begin
          delay(50);
          G(p2,0,0);
          down(p2,n2);
          G(p2,10,12);
         end;
#71,#103:begin
         delay(50);
         G(p2,0,0);
         p90(p2,x2,y2,n2,pi/2);
         G(p2,10,12);
         end;
 
#27:exit;
end;
until c=#27;
end.
Вопрос: Поворот прямоугольника относительно точки

Столкнулся со следующей проблемой. Есть Класс который содержит координаты вершин прямоугольника и галочки внутри него. Надо повернуть эту фигуру относительно любой вершины прямоугольника. Нужна процедуру которая расчитает координаты повёрнутой фигуры. Так же возможно ли вращать этот объект бесконечно?


Рисую фигуру таким способом:

Вызов следующих операторов в кнопке
C#
1
2
pictureBox1.Refresh();
pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black); 
 
            g.DrawLine(p, F.x1[0], F.y1[0], F.x1[1], F.y1[1]);
            g.DrawLine(p, F.x1[0], F.y1[0], F.x1[2], F.y1[2]);
            g.DrawLine(p, F.x1[1], F.y1[1], F.x1[3], F.y1[3]);
            g.DrawLine(p, F.x1[2], F.y1[2], F.x1[3], F.y1[3]);
 
            g.DrawLine(p, F.x2[0], F.y2[0], F.x2[1], F.y2[1]);
            g.DrawLine(p, F.x2[1], F.y2[1], F.x2[2], F.y2[2]);
 
        }
Координаты вершин прямоугольника в матрицах х1 и у1, координаты галочки в х2 и у2 соответственно.
C#
1
2
3
4
5
 public float[] x1 = new float[4];
        public float[] y1 = new float[4];
 
        public float[] x2 = new float[3];
        public float[] y2 = new float[3];
Ответ:
C#
1
2
3
4
5
6
 PointF[] p = new PointF[4];
 
            for (int i = 0; i < 4; i++)
                p[i] = new PointF(x1[i], y1[i]);
 
            Matrix myMatrix = new Matrix();
Дописал это, а как в майматрикс передать значения p чтобы её повернуть?

Добавлено через 46 минут
Вопрос исчерпан нашёл просто математическую формулу поворота точки относительно другой на заданный угол.