Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Образовательный студенческий форум _ Информатика / Программирование _ Аффинные преобразования на плоскости

Автор: julia_lisha 20.7.2010, 11:27

Здравствуйте!!!!
задание по комп.графике......
может кто подскажет литературу по данной теме)

Задание:

комната 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 20.7.2010, 16:06

Хм... Во-первых, вот что выясним. Листочек когда поворачивается, он ведь другие не затрагивает? Только своё положение меняет, то всё довольно просто.

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

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

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

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

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

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

Автор: julia_lisha 21.7.2010, 12:12

о, спасибо огромное!!!
теперь задание на много стало понятнее, но все же....

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

и как выполнить

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

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

вышло так, что дали просто лекцию....которую я никак не могу связать с данным примером, если необходимо могу предоставить.....

Автор: Vahappaday 21.7.2010, 14:42

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

Определить, в какую область попала точка, если вообще попала, можно из формул скалярного и векторного умножения
Пусть a - вектор ориентации, b - вектор из центра листка к координате капли. Тогда
http://img810.imageshack.us/i/equation.png/,
где x - векторное умножение, * - скалярное - если нужно, дам формулы для двухмерного случая.

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

Как-то так, будут вопросы - обращайтесь)

Автор: julia_lisha 21.7.2010, 15:30

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

Автор: julia_lisha 26.7.2010, 7:24

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 26.7.2010, 9:42

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

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


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

Автор: julia_lisha 26.7.2010, 10:24

если заменить 2 пункт, то....

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

Цитата
x' 49
=
y' 28



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

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




Автор: Vahappaday 26.7.2010, 11:36

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


Автор: Vahappaday 26.7.2010, 12:04

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

Автор: julia_lisha 27.7.2010, 9:54

blush.gif спасиб большое!!!

Цитата
Будет желание, можно проанализировать и падение капли

Да это уже не моя инициатива....мне просто это не обходимо это сделать....))))
blush.gif и я снова жду твой помощи....

Автор: Vahappaday 27.7.2010, 11:17

Попробуй сама, полезней будет, будет совсем туго - посчитаю

Автор: julia_lisha 27.7.2010, 11:35

конечно самаsmile.gif просто так на всякий случай....чтобы ты меня проверял

Автор: julia_lisha 30.7.2010, 13:53

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

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


a - вектор ориентации
мне нужно взять:
вектора ориентации после поворота листков
или
вектора ориентации после поворота стола
?
и что то с b не разберусь...эту переменную снова считать?
только пока не решай за меня,хочу сама smile.gif
заранее, спасибо

Автор: Vahappaday 31.7.2010, 9:07

a - вектор ориентации после всех поворотов
b - это совсем не та B, что в начале. В начале у нас B - это угол поворота стола в градусах. Теперь же

Цитата
b - вектор из центра листка к координате капли
, естественно, центр листка брать после всех преобразований.
Как вычислять новые координаты капли, я написал, только отнимать там надо не по 2,5, видимо, а по 250 (будем считать, что всё остальное дано у нас в сантиметрах).

Автор: julia_lisha 31.7.2010, 9:40

Цитата
a - вектор ориентации после всех поворотов

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

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

значит после поворота стола (x2, у2)
все верно?

Автор: Vahappaday 31.7.2010, 15:08

Всё, кроме координат капли.
Координаты будут (20,3) - относительно центра стола и комнаты.

Автор: julia_lisha 3.8.2010, 10:33

а можно формулу для подсчета координаты капли?

Автор: Vahappaday 3.8.2010, 14:11

x'=x-250
y'=y-250

Вычитаем по половине длины и ширины комнаты

Автор: julia_lisha 5.8.2010, 11:57

ммм, ясно smile.gif
теперь на счет формулы....

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

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

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


Автор: Vahappaday 7.8.2010, 15:46

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 8.8.2010, 12:01

Я посчитала 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 13.8.2010, 11:20

bx, by - вроде бы такие же вышли
ABCD - верно

Скалярное умножение: a*b = ax*bx+ay*by
Векторное умножение: a*b = ax*by - bx*ay

Автор: julia_lisha 16.8.2010, 8:40

Цитата
У меня области расположенны так
АВ
С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 4.9.2010, 17:21

акутально ещё? просто на юге был...

Автор: julia_lisha 5.9.2010, 9:43

конечно актуально)))))

Автор: Vahappaday 5.9.2010, 14:33

Эх... опять немножко с синусами/косинусами облажался...
Всё было верно, если бы у нас вектор ориентации изначальный был (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 6.9.2010, 3:25

Цитата
Эх... опять немножко с синусами/косинусами облажался...

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



Автор: Vahappaday 6.9.2010, 10:11

Да, я написал как правильно по-новому

Автор: julia_lisha 6.9.2010, 10:45

то есть изменили только вектор ориентации и соответсвие?

Автор: julia_lisha 6.9.2010, 11:20

Цитата
b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy



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

спасиб, что все еще помогаешь blush.gif

Автор: Vahappaday 6.9.2010, 12:45

и то, и другое b - вектор из центра на каплю. Только в sin и cos - там вектор, я указал раньше, как считать. А снаружи b, на которое мы домножаем синус и косинус, получается модуль этого вектора.

Автор: julia_lisha 6.9.2010, 13:13

получается так
bх*(ax*bx+ay*by)
bу*(ax*bx+ay*by)

bх*(ax*by - bx*ay)
bу*(ax*by - bx*ay)
???

Автор: Vahappaday 6.9.2010, 13:54

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

Автор: julia_lisha 6.9.2010, 14:23

ааа блин это что я не полностью формулу сделала...
извини у меня чет не получается сюда картинки вставлять
ты мне в 4 сообщение формулы дал косинус и синус там....
потом написал скалярное и векторно произведение:

Цитата
Скалярное умножение: a*b = ax*bx+ay*by
Векторное умножение: a*b = ax*by - bx*ay

получается тут тоже потерянны синус и косинус?

Автор: Vahappaday 6.9.2010, 15:11

нет, тут всё ок, но только как раз через эти произведения я предлагал вычислить синус и косинус.

Автор: julia_lisha 7.9.2010, 13:04

Цитата(Vahappaday @ 6.9.2010, 13:54) *

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

а где там знаменатели в формуле? unsure.gif

Автор: Vahappaday 7.9.2010, 19:54

Цитата(Vahappaday @ 21.7.2010, 18:42) *

http://img810.imageshack.us/i/equation.png/,


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

Автор: julia_lisha 8.9.2010, 11:42

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

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

блин капец какое задание, мне уже стыдно, что я так долго над ним сижу......... sad.gif

Автор: Vahappaday 8.9.2010, 12:49

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

например, 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 8.9.2010, 13:19

Цитата(Vahappaday @ 8.9.2010, 15:49) *

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

скалярное призведение

Автор: julia_lisha 8.9.2010, 13:34

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

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

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



Автор: tig81 8.9.2010, 13:47

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

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

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

Автор: julia_lisha 8.9.2010, 14:29

о, все!!! я почитала геметрию все нашла)))))) спасибо вам!

Автор: tig81 8.9.2010, 14:34

smile.gif

Автор: julia_lisha 8.9.2010, 15:02

посчитала 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 8.9.2010, 17:25

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

Автор: julia_lisha 11.9.2010, 13:09

b*sin(a^B ) <= Sx
b*cos(a^B ) <= Sy

а какую b необходимо брать?

Автор: Vahappaday 11.9.2010, 16:08

ух)) чем дальше, тем сложнее вспоминать)))
а b - у нас вроде как один для каждого листочка, или я не прав?
Единственное что добавлю, b и B - в данном случае одно и то же)))

Автор: julia_lisha 12.9.2010, 8:52

sin(a^B ) и cos(a^B ) уже посчитанны.
Sx и Sy даны в задании.

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

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

или брать

b - вектор из центра листка к координате капли
не могу понять...

Автор: Vahappaday 12.9.2010, 9:43

b - модуль вектора из листка к капле

Автор: julia_lisha 12.9.2010, 10:27

Цитата
b - у нас вроде как один для каждого листочка
b - модуль вектора из листка к капле

нет, получает bx и by разные для каждого листочка

или я что то снова не так поняла?



Автор: Vahappaday 12.9.2010, 14:57

каждому листочку соответствует свой, один, уникальный вектор cool.gif)) У него есть координаты bx и by)) Модуль, она же длина вектора - это корень из суммы квадратов координат (|b|=sqrt(bx^2+by^2)).
Если бы хотел сказать, что вектор b - один для всех, сказал бы "один для всех"))

Автор: julia_lisha 13.9.2010, 10:51

посчитала)

b*cos(a^B )
-16,13519648
-3,05029232
85,46667149
11,71848325
17,05023954

Sy
58
35
39
67
41

выходит(cos)
п(-)
п(-)
нп
п(+)
п(+)

b*sin(a^B )
40,06626058
3,621092061
-6,911322715
-5,41052212
18,93622435

Sx
69
25
79
53
57

выходит(sin)
п(+)
п(+)
п(-)
п(-)
п(+)

четверть определять по знаку косинуса и синуса, знаки подписала.
чтобы определить четверть используем формулу или по соотношению?

A: sin>0 cos>0
B: sin<0 cos>0
C: sin>0 cos<0
D: sin<0 cos<0
верно?

Автор: Vahappaday 13.9.2010, 11:53

чегой-то она почти везде попала, меня это настораживает))
Оговорюсь сразу, циферки кое-где не пересчитывал....
Как определять четверть, написано правильно, A,B,C,D.....

Автор: julia_lisha 16.9.2010, 12:49

все же соответствие должно быть таким:
A: sin>0 cos<0
B: sin>0 cos>0
C: sin<0 cos<0
D: sin<0 cos>0


1(A)-2(A)-4(D)-5(B )

верно? smile.gif

Автор: Vahappaday 16.9.2010, 14:27

Нет, не таким...
Я же потом поправился...

Области такие
АВ
СD

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


Автор: julia_lisha 16.9.2010, 14:55

блин ну почему нет такие то???
я по свойствам делала

Автор: Vahappaday 16.9.2010, 19:49

Ага)) Только в свойствах 0-й угол считается от горизонтали))
А у нас косинусы и синусы угла между направлением на точку и вектором направления, который смотрит вертикально вверх. Поэтому область A - это углы [0;90], B - [270;360]; C - [90;180]; D - [180;270];
Для них можно посмотреть знаки синусов и косинусов. К сожалению, не могу нарисовать и сфоткать, но смысл в том, что отсчитываем мы не от горизонтали, а от вектора направления, который изначально смотрит как раз вертикально вверх.

Автор: julia_lisha 20.9.2010, 11:25

спасибо, что объяснил)
ответ вышел таким: 1(С )-2(С )-4(B )-5(A)
в 3 лист же не попала капля?

Автор: Vahappaday 20.9.2010, 13:39

получается, что не попала)))

Автор: julia_lisha 20.9.2010, 14:13

эх...наконец то задание сделанно)))
спасибо тебе большое, за помощь!!!!

Автор: Vahappaday 20.9.2010, 15:15

да, пожалуйста))
хотя... оно больше на геометрию, чем на информатику/программирование.
Мы даже на DirectX кой-чего писали - вот єто мудрено и интересно)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)