Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
#1

простая математическая модель вращения - C++

23.05.2010, 22:05. Просмотров 1228. Ответов 7

Есть линия длинной len и центром в точке x,y
теперь вопрос - как заставить вращаться ее вокруг своего центра?
while(!kbnhit())
{
line(x1,y1,x2,y2);//уравнение построения прямой от точки x1,y1 до x2,y2
d++; // коэффициент поворота
}

Думаю приблизительно такое должно выйти
line(x-len/2,y+d,x+len/2,y-d); - но так длинна фигуры увеличивается и фигура просто растет...

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

Пока немного кода, но может пригодится:
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
#include <iostream>
#include <time.h>
#include <graphics.h>
#include <dos.h>
#include <conio.h>
using namespace std;
 
class form
{
    protected:
        int x;
        int y;
        int len;
        int col; //öâåò
        int drt; //ïåðåäâèæåГ*ГЁГҐ - derectangle
    public:
        form();
        ~form();
        int _x() {return x;}
        int _y() {return y;}
        int _len() {return len;}
        int _drt() {return drt;}
        void x_(int x) {this->x=x;}
        void y_(int y) {this->y=y;}
        void len_(int len) {this->len=len;}
        virtual void move()=0;
        virtual void move(int)=0;
        virtual void draw()=0;
};
 
    form::form()
    {
        len=20+random(100);
        x=len+random(getmaxx()-2*len);
        y=len+random(getmaxy()-2*len);
        col=1+random(15);
    }
 
class line: public form
{
    public:
        line(): form()
        {
            x=len+random(20);
            drt=10;
        }
        void move()
        {
            x+=drt;
        }
        void draw()
        {
            setcolor(col);
            line(x-len/2,y,x+len/2,y);
        }
        
};
 
void main()
{
    randomize();
    getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
23.05.2010, 22:11  [ТС]     простая математическая модель вращения #2
могу также предоставить пример программы подобной этой, чтобы понять суть того, что требуется.
(компилировать в TC или Borland C++ 3)
Вложения
Тип файла: rar ABSTRACT - 07-04-10.rar (918 байт, 39 просмотров)
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
23.05.2010, 22:45  [ТС]     простая математическая модель вращения #3
я тут еще подумал: фактически данная линия - диаметр круга и она просто пробегает по кругу, хотя от этих знаний мне легче не стало...
arcture
39 / 39 / 1
Регистрация: 27.03.2010
Сообщений: 74
23.05.2010, 22:58     простая математическая модель вращения #4
http://ru.wikipedia.org/wiki/Матрица_поворота
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
23.05.2010, 23:11  [ТС]     простая математическая модель вращения #5
это немного не то, что мне нужно... мне нужны координаты... А это не совсем то, что я представлял - ведь линия рисуется ее координатами - целыми числами (т.к. значение пикселя не может быть дробным). Плюс ко всему нужно умножать как одну координату, так и другую. Я знаю, что они связаны между собой по законам синуса и косинуса, но вот как преобразовать их в линейные координаты... Если бы я знал - сюда бы не обращался...
arcture
39 / 39 / 1
Регистрация: 27.03.2010
Сообщений: 74
23.05.2010, 23:18     простая математическая модель вращения #6
У Вас есть точка_до_вращения (x, y). Умножая матрицу вращений на координаты точки, получаете точку_после_вращения (x', y'). Округляете, выводите.

Вот вполне линейные координаты

x' = x*cos(alpha) - y*sin(alpha)
y' = x*sin(alpha) + y*cos(alpha)
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
23.05.2010, 23:34  [ТС]     простая математическая модель вращения #7
т.е. будет нечто подобное?
line((x-len/2)*cos(d),-y*sin(d),(x+len/2)*cos(d),y*sin(d))

Добавлено через 7 минут
line(x1,y1,x2,y2);
x1`=(x-len/2)*cos(d)-y*sin(d)
y1`=(x-len/2)*sin(d)+y*cos(d)
x2`=(x+len/2)*cos(d)-y*sin(d)
y2`=(x+len/2)*sin(d)+y*cos(d)

вот - вроде так, для моего случая
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 23:34     простая математическая модель вращения
Еще ссылки по теме:

C++ Математическая константа Е
C++ Математическая задача
Математическая задача на C++ C++
Программа на C++, которая переводит цветовую модель RGB в модель HSV C++
Математическая статистика C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
arcture
39 / 39 / 1
Регистрация: 27.03.2010
Сообщений: 74
23.05.2010, 23:34     простая математическая модель вращения #8
да. Такое преобразование нужно делать над каждой точкой которую будете вращать.
Yandex
Объявления
23.05.2010, 23:34     простая математическая модель вращения
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru