Помощь - Поиск - Пользователи - Календарь
Полная версия: Аффинные преобразования на плоскости > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
Страницы: 1, 2
julia_lisha
Здравствуйте!!!!
задание по комп.графике......
может кто подскажет литературу по данной теме)

Задание:

комната 5 на 5 метров. в этой комнате в самом центе расположен стол.
на столе расположенны пронумерованные прямоугольные листочки бумаги.
листочки склажываются на стол в порядке их нумерации: 1-2...
стол прямогольный его размеры Тх и Ту.
центр слола расположен ы центре комнаты.
также известны размеры листочков по осям Х и У равные Sxi и Sуi (i-номер листочка),
расположение центра каждого листочка на столе (две координаты Dxi и Dуi относительно левого нижнего угла стола).
после каждый листочек поворачивается на угол ai относительно своего центра(если угол больше - поворачиваем по часой стрелке иначе против).
порядок листочков при этом не меняется.
Затем таким же образом поворасивается стол на угол b.
про листочки известно что каждый из них разделен на 4 одинаковые прямоугольные области - A,B,C,D.
теперь с потолка падает капля и попадает на стол, возможно попадая на некоторые листочки. предполается что капля бесконечно малого размера (имеется в вид протяженность по осям X и У) но тем не менее,способна промочить сколь угодно листочков.
про капля известны ее координаты Cx, Сув момент падения относительно левого нижнего угла комнаты.
необходимо определить на какие именно листочки попадет капля в каой поледовательности она их намочит, а также для каждого промоченногго листочка необходимо указать в какую из его обласстей A,B,C,D попала капля.


(Тх,Ту,B )-(192,120,62)
(Sx1,Sy1)-(69,58)
(Dx1,Dy1,a1)-(145,88,10)
(Sx2,Sy2)-(29,35)
(Dx2,Dy2,a2)-(107,77,66)
(Sx3,Sy3)-(79,39)
(Dx3,Dy3,a3)-(17,80,86)
(Sx4,Sy4)-(53,67)
(Dx4,Dy4,a4)-(90,77,56)
(Sx5,Sy5)-(57,41)
(Dx5,Dy5,a5)-(90,57,78)
(Cx,Cy)-(270,253)
Vahappaday
Хм... Во-первых, вот что выясним. Листочек когда поворачивается, он ведь другие не затрагивает? Только своё положение меняет, то всё довольно просто.

Выяснять порядок промокания тогда не нужно: если намочено несколько листочков, то первыми намокнут те, которые положили последними.

Теперь о преобразованиях.
Из преобразований понадобится поворот вокруг точки:
формула следующая
Изображение
x', y' - новые координаты, x, y - старые, alpha - угол поворота, cx, cy - центр поворота

Ещё я бы хранил что-то типа "векторов ориентации" для этих листочков, их тоже надо поворачивать вокруг оси а затем и вместе со столом. Изначально, как я понял, они у всех одинаковые и направлены, например в направлении (0;1). Потом по ним можно будет определить попадание капли в одну из областей.

Удобно будет всё привести к одной системе координат. Я бы взял за её начало центр стола.

Осталось лишь определить, попала ли точка в тот или иной листочек. Предлагаю сначала определить возможную область попадания. То есть, найти угол между вектором направления листочка, а уж затем проверять, согласовываясь с длиной и шириной листка.

Литературы, к сожалению, не знаю, у нас очень хороший преподаватель по КГ, мы у него всё узнавали, что непонятно было.
julia_lisha
о, спасибо огромное!!!
теперь задание на много стало понятнее, но все же....

с чего необходимо начать? blush.gif

и как выполнить
Цитата
Ещё я бы хранил что-то типа "векторов ориентации" для этих листочков, их тоже надо поворачивать вокруг оси а затем и вместе со столом. Изначально, как я понял, они у всех одинаковые и направлены, например в направлении (0;1). Потом по ним можно будет определить попадание капли в одну из областей.

это выполняется с помощью каких то формул?

вышло так, что дали просто лекцию....которую я никак не могу связать с данным примером, если необходимо могу предоставить.....
Vahappaday
1. Выбрать систему отсчёта (как я уже сказал - центр стола)
2. Записать новые координаты центров листков
Изображение
//прошу прощения, тут вместо Dx, Dy должны быть Tx и Ty соответственно.
3. Для каждого листка задать вектор ориентации (0;1).
4. Повернуть каждый листок на свой угол, то есть ту формулу, что я написал выше, надо применить к векторам поворота. В качестве центра - взять координаты центра каждого листка в новой системе координат.
5. Применить ко всем точкам и ко всем векторам формулу поворота относительно точки (0; 0) (центр стола)
6. Рассчитаем новую координату точки падения капли - отнимем от x и к y по 2,5 (половина длины/ширины комнаты)
После этих 5 пунктов мы имеем записанные в одной новой системе координат с центром в середине комнаты:
а. Координаты центров листков.
б. Векторы ориентации листков.
в. Координаты падения капли
г. Размеры всех листков (естественно, никуда не поменялись)

Определить, в какую область попала точка, если вообще попала, можно из формул скалярного и векторного умножения
Пусть a - вектор ориентации, b - вектор из центра листка к координате капли. Тогда
Изображение,
где x - векторное умножение, * - скалярное - если нужно, дам формулы для двухмерного случая.

Их же используем для проверки попадания в листок, капля попала в листок, если:
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy

Как-то так, будут вопросы - обращайтесь)
julia_lisha
большое-большое спасибо, прямо огромное, за подробное описание)
к сожалению сейчас не будет возможности иметь доступ в иннет, но 27 числа я обязательно отпишусь....так что не теряйте....и возможно появятся вопросы...
julia_lisha
blush.gif а вот и вопросы......
начнем по пунктам:
1. (96,60)--центр стола

2.Записать новые координаты центров листков
я так поняла в формуле под x y мне брать Dxi и Dyi-(расположение центра каждого листочка на столе, относительно левого нижнего угла стола),если так, то
Цитата
x' 241
=
y' 148

это координаты для первого листочка
и т.д. до 5 листочка

3. Для каждого листка задать вектор ориентации (0;1).
я так понимаю этот пункт остается без изменения

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

формула поворот вокруг точки?
Цитата
cx, cy - центр поворота

хм...чет у меня нет таких переменных....или я просто их не вижу?!

5. Применить ко всем точкам и ко всем векторам формулу поворота относительно точки (0; 0) (центр стола)

хм или сюда формулу поворот вокруг точки?))))))

дальше пока нет смысла спрашивать, пока это все не сделанно....
blush.gif заранее спасибо, жду ответа



Vahappaday
Потихоньку буду добавлять комментарии:
Во 2 пункте у меня ошибка, там вместо + нужен -.
Если у точки была координата 96; 60, то она должна стать 0;0, а не 192; 120

Ещё один мой недочёт - векторы поворота можно вертеть относительно любой точки. Вращаем относительно 0;0, и в 4, и в 5 пункте
Даже не относительно любой, а именно относительно 0;0))


А поскольку мы выбрали новую систему отсчёта, то и точки в 5 пункте мы будем вращать относительно 0;0.
julia_lisha
если заменить 2 пункт, то....

координата точки Dx1,Dy1 (145,88)
Dx1,Dy1-расположение центра каждого листочка на столе, относительно левого нижнего угла стола.
или тут надо брать (Sx1,Sy1)-(69,58) - размеры листочков по осям Х и У?!
Цитата
x' 49
=
y' 28



Цитата
Если у точки была координата 96; 60

это центр стола....



Vahappaday
именно так, теперь x' и y' верные
Теперь надо поворачивать. Сначала каждый листочек по отдельности, затем все вместе

Vahappaday
http://slil.ru/29501550 - вот расчёт первого этапа - все листочки и стол повернуты. Будет желание, можно проанализировать и падение капли)
julia_lisha
blush.gif спасиб большое!!!
Цитата
Будет желание, можно проанализировать и падение капли

Да это уже не моя инициатива....мне просто это не обходимо это сделать....))))
blush.gif и я снова жду твой помощи....
Vahappaday
Попробуй сама, полезней будет, будет совсем туго - посчитаю
julia_lisha
конечно самаsmile.gif просто так на всякий случай....чтобы ты меня проверял
julia_lisha
Цитата
Определить, в какую область попала точка, если вообще попала, можно из формул скалярного и векторного умножения
Пусть a - вектор ориентации, b - вектор из центра листка к координате капли.

Их же используем для проверки попадания в листок, капля попала в листок, если:
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy


a - вектор ориентации
мне нужно взять:
вектора ориентации после поворота листков
или
вектора ориентации после поворота стола
?
и что то с b не разберусь...эту переменную снова считать?
только пока не решай за меня,хочу сама smile.gif
заранее, спасибо
Vahappaday
a - вектор ориентации после всех поворотов
b - это совсем не та B, что в начале. В начале у нас B - это угол поворота стола в градусах. Теперь же
Цитата
b - вектор из центра листка к координате капли
, естественно, центр листка брать после всех преобразований.
Как вычислять новые координаты капли, я написал, только отнимать там надо не по 2,5, видимо, а по 250 (будем считать, что всё остальное дано у нас в сантиметрах).
julia_lisha
Цитата
a - вектор ориентации после всех поворотов

о, с этим я разобралась (ВОx2, ВОy2)
Цитата
b - вектор из центра листка к координате капли

так теперь с этим, координаты капли мне известны (Cx,Cy)-(270,253)
Цитата
центр листка брать после всех преобразований.

значит после поворота стола (x2, у2)
все верно?
Vahappaday
Всё, кроме координат капли.
Координаты будут (20,3) - относительно центра стола и комнаты.
julia_lisha
а можно формулу для подсчета координаты капли?
Vahappaday
x'=x-250
y'=y-250

Вычитаем по половине длины и ширины комнаты
julia_lisha
ммм, ясно smile.gif
теперь на счет формулы....
Цитата
Определить, в какую область попала точка, если вообще попала, можно из формул скалярного и векторного умножения

там две формулы COS и SIN можно брать любую?
Цитата
b - вектор из центра листка к координате капли

смотри у меня получается b это (Cx,Cy) и (x2, у2), чтобы преобразовать две переменные в одну (cool.gif надо еще какую то использовать формулу или как? unsure.gif
еще раз спасибо blush.gif

Vahappaday
bx = Cx_new - x2
by = Cy_new - y2

Формулы нужны обе.

Допустим области вот так расположены
BA
CD

Тогда соответствие будет такое
A: sin>0 cos>0
B: sin>0 cos<0
C: sin<0 cos<0
D: sin<0 cos>0

Только нужно проверить расстояние ещё.
julia_lisha
Я посчитала bx, by.
bx
-27,72663918
-0,174296269
39,4293016
7,806720298
25,46567216

by
33,11922829
4,731406954
-76,14229109
-10,27870212
-0,889270869

У меня области расположенны так
АВ
СD

Соответствие:
A: sin>0 cos<0
B: sin>0 cos>0
C: sin<0 cos<0
D: sin<0 cos>0
Верно?

Векторное и скалярное умножение можно посчитать в MS Excel?
Vahappaday
bx, by - вроде бы такие же вышли
ABCD - верно

Скалярное умножение: a*b = ax*bx+ay*by
Векторное умножение: a*b = ax*by - bx*ay
julia_lisha
Цитата
У меня области расположенны так
АВ
СD

Соответствие:
A: sin>0 cos<0
B: sin>0 cos>0
C: sin<0 cos<0
D: sin<0 cos>0

почему именно так знаки а никак иначе?

a*b
-16,13519648
-3,05029232
85,46667149
11,71848325
17,05023954

aXb
40,06626058
3,621092061
-6,911322715
-5,41052212
18,93622435

Цитата
Их же используем для проверки попадания в листок, капля попала в листок, если:
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy

теперь этими формулами пользоваться?






Vahappaday
акутально ещё? просто на юге был...
julia_lisha
конечно актуально)))))
Vahappaday
Эх... опять немножко с синусами/косинусами облажался...
Всё было верно, если бы у нас вектор ориентации изначальный был (1;0)
А так... Получается немного иначе...

У меня области расположенны так
АВ
СD

Соответствие:
A: sin>0 cos>0
B: sin<0 cos>0
C: sin>0 cos<0
D: sin<0 cos<0

Советую проверить, эти вот выводы берутся из свойств синуса и косинуса.

Кстати, формула для проверки попадания почему-то верная... Наверное, я их в разное время выводил...
Да, дальше использовать её.
julia_lisha
Цитата
Эх... опять немножко с синусами/косинусами облажался...

че где то ошибка??? sad.gif


Vahappaday
Да, я написал как правильно по-новому
julia_lisha
то есть изменили только вектор ориентации и соответсвие?
julia_lisha
Цитата
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy



b (вектор из центра листка к координате капли) такого наименования брать?
и что значит В?

спасиб, что все еще помогаешь blush.gif
Vahappaday
и то, и другое b - вектор из центра на каплю. Только в sin и cos - там вектор, я указал раньше, как считать. А снаружи b, на которое мы домножаем синус и косинус, получается модуль этого вектора.
julia_lisha
получается так
bх*(ax*bx+ay*by)
bу*(ax*bx+ay*by)

bх*(ax*by - bx*ay)
bу*(ax*by - bx*ay)
???
Vahappaday
вовсе нет. Забыла про знаменатели косинуса и синуса...
julia_lisha
ааа блин это что я не полностью формулу сделала...
извини у меня чет не получается сюда картинки вставлять
ты мне в 4 сообщение формулы дал косинус и синус там....
потом написал скалярное и векторно произведение:
Цитата
Скалярное умножение: a*b = ax*bx+ay*by
Векторное умножение: a*b = ax*by - bx*ay

получается тут тоже потерянны синус и косинус?
Vahappaday
нет, тут всё ок, но только как раз через эти произведения я предлагал вычислить синус и косинус.
julia_lisha
Цитата(Vahappaday @ 6.9.2010, 13:54) *

Забыла про знаменатели косинуса и синуса...

а где там знаменатели в формуле? unsure.gif
Vahappaday
Цитата(Vahappaday @ 21.7.2010, 18:42) *

Изображение,


В знаменателе, как видно, произведение модулей векторов.
julia_lisha
Цитата
В знаменателе, как видно, произведение модулей векторов.

получается знаменатель это скалярное умножение при модуле, так? blush.gif

блин капец какое задание, мне уже стыдно, что я так долго над ним сижу......... sad.gif
Vahappaday
не скалярное умножение векторов...
Скалярное умножение модулей....
(может, ты об этом и говорила, конечно ))) ) Но на всякий случай вот пример:

например, a=(3;4), b=(4;3)
|a|=|b|=корень(3^2+4^2)=корень(25)=5.
скалярное умножение a*b=3*4+4*3=24
умножение модулей |a|*|b|= 5*5 = 25
tig81
Цитата(Vahappaday @ 8.9.2010, 15:49) *

скалярное умножение a*b=3*4+4*3=24

скалярное призведение
julia_lisha
пример оч нужный)
у меня выражение: |a|*|b|
теперь смотри мне надо сначало:
1. скалярное призведение
2. умножение модулей

Цитата
|a|=|b|=корень(3^2+4^2)=корень(25)=5

почему |a|=|b|?


tig81
Цитата(julia_lisha @ 8.9.2010, 16:34) *

почему |a|=|b|?

потому что от перестановки слагаемых сумма не меняется. smile.gif
А длины векторов равны соответственно sqrt(3^2+4^2) и sqrt(4^2+3^2)
julia_lisha
о, все!!! я почитала геметрию все нашла)))))) спасибо вам!
tig81
smile.gif
julia_lisha
посчитала smile.gif

a*b
-0,373558992
-0,644253339
0,996746318
0,907900672
0,669130315


aXb
0,927606425
0,764812157
-0,080602595
-0,419185364
0,743145088

Цитата
Их же используем для проверки попадания в листок, капля попала в листок, если:
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy


теперь с этими формулами работать или что то еще необходимо сделать?

кстати ответ выглядит т.о.: 1(А)-2(В)-4(D)-3©-5(A)

мы на правильном пути?

Vahappaday
Хм.. ответ? Не знаю ответа...)))
Но вот эти вот два столбца - уже не произведения, а косинусы и синусы соответственно. Сначала косинусы, потом синусы.
Теперь нужно проверить, попала ли она в листок, или нет. Попадает, когда
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy
Если попала, то по знаку синуса и косинуса определяем четверть.
julia_lisha
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy

а какую b необходимо брать?
Vahappaday
ух)) чем дальше, тем сложнее вспоминать)))
а b - у нас вроде как один для каждого листочка, или я не прав?
Единственное что добавлю, b и B - в данном случае одно и то же)))
julia_lisha
sin(a^B ) и cos(a^B ) уже посчитанны.
Sx и Sy даны в задании.

b - у нас вроде как один для каждого листочка

есть b в задание это поворот стола на угол.

или брать

b - вектор из центра листка к координате капли
не могу понять...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.