Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Как вращать фигуру с произвольным количеством произвольных точек вокруг некоторой точки?

09.06.2017, 20:45. Показов 835. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я решил делать так:
Для каждой точки находил ее расстояние между A и ней.
Потом находил угол изначальный между ними (из прямоугольного треугольника).
Затем для каждой координаты писал подобное: coordinate + distance*cos(angle+MyAngle).
MyAngle - указанный угол, на который надо вращать точки.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
    ///Угол между двумя точками из прямоугольного треугольника.
    class function AngleBetween(x, y, x2, y2: real): real;
    var
      a: real;
    begin
      a := RadToDeg(ArcTan(Abs(y2 - y) / Abs(x2 - x)));
      if (x2 >= x) and (y2 >= y) then AngleBetween := a;
      if (x2 < x) and (y2 >= y) then AngleBetween := 90 - a + 90;
      if (x2 <= x) and (y2 < y) then AngleBetween := a + 180;
      if (x2 > x) and (y2 < y) then AngleBetween := 90 - a + 270;
      if (x = x2) and (y = y2) then AngleBetween := 0;
    end;
Добавлено через 1 минуту
Но у меня вращало не так как надо. Что не так?
Pascal
1
2
    ///Расстояние между точками.
    class function Dist(x, y, x2, y2: real) := Sqrt(Power(x2 - x, 2) + Power(y2 - y, 2));
Еще:
Pascal
1
2
3
4
5
6
        d1 := Dist(x, y, pointsX[p], pointsY[p]);
        d2 := Dist(x, y, pointsX[p + 1], pointsY[p + 1]);
        d3:=Dist(pointsX[p], pointsY[p], pointsX[p + 1], pointsY[p + 1]);
        prm:=(d1+d2+d3)/2;
        S:=Sqrt(prm*(prm-d1)*(prm-d2)*(prm-d3));
        a1:=a1+ArcSin((2*S)/(d1*d2));
Добавлено через 3 минуты
P S. У меня изначально есть две точки. Между ними интерполируется кривая. Нужно сделать вращение кривой, которая строится с использование функции:
Pascal
1
2
3
4
5
6
7
8
    class function SinInterpolation(a, b: integer; p: byte): real;
    var
      d: real;
    begin
      // p лежит от 0 до 100
      d := Abs(a - b) * Abs(Sin((p / 100) * (Pi) - Pi / 2) * 0.5 + 0.5);
      if a > b then SinInterpolation := a - d else SinInterpolation := a + d; 
    end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2017, 20:45
Ответы с готовыми решениями:

Графика: Повернуть фигуру заданной массивом из N точек , i=0, … , (N-1) вокруг точки T на угол d...
2. Задание Повернуть фигуру заданной массивом из N точек , i=0, … , (N-1) вокруг точки T на угол d. Решить задачу двумя...

Вращать сферу вокруг центра координат, и одновременно вращать ее вокруг своей оси
Всем привет! Долблюсь о стену второй день ( Суть в том, что мне необходимо вращать сферу вокруг центра координат и одновременно...

Вращение точки вокруг другой точки в некоторой плоскости
Доброго времени суток. Хочу написать модель атома в 3d. Нужно определить закон смены координат точки А вокруг точки В. Но вся проблема в...

7
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
09.06.2017, 21:54
Я делал так.
Объявлял тип точка с полями
x,y:координаты
r:расстояние до цента вращения
u:угол между направлением от центра на +Х и направлением на точку
потом массив точек.
в цикле менял угол и рисовал точки

Вот пример для простого АВС, работает и в net.
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
uses graphABC;
type point=record
           x,y:integer;
           r,u:real;
           end;
//угол между лучом и осью Х
function Ugol(x0,y0,x,y:integer):real;
begin
if (x>x0)and(y<=y0) then Ugol:=arctan((y0-y)/(x-x0))//I четверть
else if (x>x0)and(y>y0) then Ugol:=arctan((y0-y)/(x-x0))+2*pi//IV четверть
else if x<x0 then  Ugol:=arctan((y0-y)/(x-x0))+pi//II-III четверти
else if x=x0 then
 begin
  if y<y0 then  Ugol:=pi/2//вертикально вверх
  else if y>y0 then Ugol:=3*pi/2//вертикально вниз
 end;
end;
const n=20;
var a:array[1..n] of point;
    x,y,i:integer;
begin
randomize;
x:=250;
y:=220;
for i:=1 to n do
 begin
  a[i].x:=100+random(220);
  a[i].y:=100+random(220);
  a[i].r:=sqrt(sqr(x-a[i].x)+sqr(y-a[i].y));
  a[i].u:=Ugol(x,y,a[i].x,a[i].y);
 end;
lockdrawing;
repeat
clearwindow;
setbrushcolor(clBlue);
setpencolor(clBlue);
circle(x,y,3);
setbrushcolor(clRed);
setpencolor(clRed);
for i:=1 to n do
circle(a[i].x,a[i].y,2);
sleep(50);
for i:=1 to n do
 begin
  a[i].u:=a[i].u+0.1;
  a[i].x:=x+round(a[i].r*cos(a[i].u));
  a[i].y:=y-round(a[i].r*sin(a[i].u));
 end;
redraw;
until false;
end.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
10.06.2017, 08:26  [ТС]
Так проблема в том, что мы не знаем углов изначально.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
10.06.2017, 08:37
Почему? А это?
Pascal
1
2
3
4
5
6
7
8
9
x:=250;//координаты точки вращения
y:=220;
for i:=1 to n do
 begin
  a[i].x:=100+random(220);//начальные координаты точек
  a[i].y:=100+random(220);
  a[i].r:=sqrt(sqr(x-a[i].x)+sqr(y-a[i].y));//расстояния до центра вращения
  a[i].u:=Ugol(x,y,a[i].x,a[i].y);//начальные углы
 end;
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
10.06.2017, 09:12  [ТС]
Ааа, сорян.

Добавлено через 13 минут
А в чем у меня была ошибка? я не понял
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
10.06.2017, 09:23
Я твой код вообще не понял.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
10.06.2017, 09:28  [ТС]
Ну, вот есть функции:
Pascal
1
2
3
4
5
6
7
8
9
    ///Выполняет соответствующую указаному типу интерполяцию.
    class function RunInterpolation(a, b: integer; p, coeff: byte; typeA: InterpolationType): real;
    begin
      if typeA = InterpolationType.LINEAR_INTERPOLATION then RunInterpolation := LinearInterpolation(a, b, p);
      if typeA = InterpolationType.RANDOM_INTERPOLATION then RunInterpolation := RandomInterpolation(a, b, p, coeff);
      if typeA = InterpolationType.ROOT_INTERPOLATION then RunInterpolation := RootInterpolation(a, b, p);
      if typeA = InterpolationType.SIN_INTERPOLATION then RunInterpolation := SinInterpolation(a, b, p);
      if typeA = InterpolationType.TAN_INTERPOLATION then RunInterpolation := TanInterpolation(a, b, p);
    end;
Интерполяции работают корректно. Не получается сделать поворот интерполированной кривой (всех ее точек).
Как мне сделать поворот?

Добавлено через 59 секунд
Если каждая функция интерполяции возвращает число. Например, линейная интерполяция между 1 и 2 при значении p вернет 1.5.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
10.06.2017, 10:01
Ну создай массив точек и вращай их как у меня, соединяя линиями.

Добавлено через 31 минуту
Вот для примера в простом АВС.
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
uses graphABC;
type point=record
           x,y:integer;
           r,u:real;
           end;
//угол между лучем и осью Х
function Ugol(x0,y0,x,y:integer):real;
begin
if (x>x0)and(y<=y0) then Ugol:=arctan((y0-y)/(x-x0))//I четверть
else if (x>x0)and(y>y0) then Ugol:=arctan((y0-y)/(x-x0))+2*pi//IV четверть
else if x<x0 then  Ugol:=arctan((y0-y)/(x-x0))+pi//II-III четверти
else if x=x0 then
 begin
  if y<y0 then  Ugol:=pi/2//вертикально вверх
  else if y>y0 then Ugol:=3*pi/2//вертикально вниз
 end;
end;
 
var t:array[1..2,1..1000] of real;
    a:array[1..1000] of point;
    n,i,c:integer;
    x,y,max,m:real;
begin
x:=-pi;
n:=0;
max:=abs(sin(x));
while x<=pi do
 begin
  n:=n+1;
  y:=sin(x);
  t[1,n]:=x;
  t[2,n]:=y;
  if abs(y)>max then max:=abs(y);
  x:=x+0.01;
 end;
if pi>max then max:=pi;
setwindowsize(500,500);
centerwindow;
c:=250;
m:=(c-50)/max;
for i:=1 to n do
 begin
  a[i].x:=c+round(t[1,i]*m);
  a[i].y:=c-round(t[2,i]*m);
  a[i].r:=sqrt(sqr(c-a[i].x)+sqr(c-a[i].y));
  a[i].u:=Ugol(c,c,a[i].x,a[i].y);
 end;
lockdrawing;
repeat
clearwindow;
setbrushcolor(clBlue);
setpencolor(clBlue);
circle(c,c,3);
setbrushcolor(clRed);
setpencolor(clRed);
for i:=1 to n do
setpixel(a[i].x,a[i].y,clRed);
sleep(50);
for i:=1 to n do
 begin
  a[i].u:=a[i].u+0.1;
  a[i].x:=c+round(a[i].r*cos(a[i].u));
  a[i].y:=c-round(a[i].r*sin(a[i].u));
 end;
redraw;
until false;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2017, 10:01
Помогаю со студенческими работами здесь

Как вращать фигуру по оси
Здравствуйте! Возник такой вопрос. Как можно просто вращать фигуру вокруг определённой оси? Пример: прямоугольник через пересечение...

Из множества точек на плоскости найти точки, образующие параллелограмм с наибольшим количеством точек внутри
&quot;Даны N точек на плоскости. Найти среди них точки являющиеся вершинами фигуры, содержащей максимальное число заданных точек. Фигура -...

Нарисовать линиями фигуру и вращать в 3D представлении
Нужно чтобы пользователь мог нарисовать линиями фигуру (например-куб), после того увидеть ее объемную (3D), и просматривать с разных...

Постройте образ окружности с центром О и точек А, В при повороте вокруг 1) точки О
Постройте образ окружности с центром О и точек А, В при повороте вокруг 1) точки О; 2) точки М, лежащей на окружности, 3) точки N, лежащей...

Вращать спрайт вокруг другого спрайта
Закрепил примерный рисонук. Есть 2 спрайта. (черный - ружье, оранжевое - искра). Ружье постоянно выводиться в руке персонажа, а искра...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru