![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jun 2012
Сообщений: 6
|
Здравствуйте. Вот уже третий день мучаюсь с построением изображения в собирающей линзе.
Есть точка, "оптический стол" и сама линза. Нужно построить изображение по следующим правилам(я взял первые 2 правила, ибо третье кажется каким-то нереализуемым): Цитата:
Так вот, я столкнулся с большим количеством вариантов решения этой задачи и выбрал два из них: 1.Линии слева от линзы строить через graphics.moveTo и graphics.lineTo, благо координаты почти все есть, а именно нам известны(смотрим рисунок): Координаты точек S, A, C, B(он же фокус) Углы SAC, ACB, CED прямые Проблема в том, что я незнаю, где пересекутся линии, идущие через фокус и через центр линзы. Однако, погуглив я понял, что можно расчитать прирост по х и y каждой точки, например, отрезка АВ и таким образом продолжить строить после пересечения с фокусом. Аналогично для центра линзы. Но я опять неузнаю, где они пересекутся. [IMG]http://higgs.**********/38567218/image.png[/IMG] 2.Вторая идея мне пришла сегодня "во сне", после целого вечера поиска тригонометрических примеров на AS3. А что если нарисовать две линии и сделать их мувиклипами. Они заменят линии AD и SD. При нажатии на кнопку построения эти линии будут повернуты на необходимую величину(нужный градус можно вычислить, благодаря известным координатам). Но тут опять загвоздка. Через какую функцию узнать, что они пересеклись? hitTest? Но мне нужна точная координата, для помещения копии начальной точки туда. И еще одна проблема: нужно, чтобы отрезок AD при любом повороте не выезжал на левую часть линзы. через что ограничить показ объекта в определенной области? Маски? Ниразу не работал с ними, подскажите какую функцию использовать. Вопрос в том, какой способ проще и быстрее(ибо времени до сдачи диплома у меня мало). Ах да, с AS работаю впервые. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
Использовать уравнение тонкой линзы. 1/f = 1/a + 1/b, если не ошибаюсь
f - фокусное расстояние, a - расстояние от объекта (источника) до линзы, b - расстояние от линзы до изображения. Я бы сначала точки нашел а потом через них провел линии. Зная f и a из уравнения легко b находится. Последний раз редактировалось Silicium; 09.06.2012 в 17:43. Причина: дополнил ответ |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
∠CBD = 180 - ∠q
∠CDB = 180 - ∠CBD - ∠y CB известна, углы известны, считаем треугольник CBD
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 09.06.2012 в 19:22. Причина: жара |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 6
|
Это понятно, а по y оси?
Цитата:
Почему тут 360? Сумма углов в треугольнике = 180 градусов, получается ∠CDE = 180 - 90 - ∠y => ∠CDE = 90 - ∠y Треугольник CBD не рассматриваем. Только не совсем понимаю, зачем нам углы. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
360 забудьте, ага. Жара. И не ∠CDE а ∠CDB )))
Цитата:
Вам ведь катеты найти надо, а у Вас кроме углов ничего нет. Решаем треугольник CBD — получаем гипотенузу, и зная углы, находим катеты в CED — т.е. координаты точки D.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 09.06.2012 в 19:17. |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 6
|
Цитата:
∠q = arctan (AC , BC) А дальше? Находим CD через одну из формул площади треугольника? S = 1/2*a*b*sin ∠альфа В нашем случае получается: S = 1/2*CB*CD*sin ∠y И вот тут я застрял. Площадь же неизвестна. Нашел еще одну формулу площади: S = a^2 * sin ∠beta * sin ∠gamma / 2* sin ∠alfa В нашем случае S =1/2* CB^2 * (sin ∠y * sin ∠CBD / 2* sin ∠CDB) ∠CDB = 180 - ∠y - ∠CBD По этим формулам через площадь вычислим CD CD = 2*S / CB * sin ∠y Поидее так. Значит мы сможем найти площадь CED. Вроде понял, потом по этой же формуле через 3 синуса и сторону искать длину катетов. Спасибо, попробую, отпишу. Последний раз редактировалось Erikozer; 09.06.2012 в 20:02. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
По у через Г - увеличение линзы, равное -f/a; тоесть если координата источник y, то y' = -y*f/a Все просто
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Wolsh решение правильное, согласен, там все считается. Покажу еще пару решений попроще. В вашем решении чтобы аналитически выразить (синусы/косинусы через начальные координаты считаются) результат через исходные координаты нужно тригонометрию помнить. Там у CDB синусы/косинусы не очень красивые будут.
Первое решение. Пишем уравнения через "проекции". CD=ED/sin(y), BD=ED/sin(q). CB=CD*cos(y) - DB*cos(q). В последнее равенство подставляются выражения для CD и BD, значения ctx(y), ctx(q) через начальные координаты и получается результат. Второе решение. Навеяно первым, но не требует тригонометрии вообще. Треугольники SAC и CED подобны. Треугольники ACB и DEB подобны. CE/ED=SA/AC, BE/ED=BC/AC (из подобия). BC=CE-BE=(SA-BC)*ED/AC. Ну и ED=BC*AC/(SA-BC). Правда, в отличие от решения через "проекции" (предыдущий случай) здесь стоит построить несколько (три) различных случая для различных расположений точки D. |
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
Да вы издеваетесь! 1/f = 1/a + 1/b - вот это и есть ОБЩЕЕ решение. Зачем решать решенную задачу?
|
|
|||||
|
Регистрация: Jun 2012
Сообщений: 6
|
Пробую пока через формулу 1/f = 1/a + 1/b
Вроде так получается, но проблема с координатами, точнее откуда должно считать. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:51. |
|
|
« Предыдущая тема | Следующая тема » |
|
|