Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.06.2012, 15:11
Erikozer вне форума Посмотреть профиль Отправить личное сообщение для Erikozer Найти все сообщения от Erikozer
  № 1  
Ответить с цитированием
Erikozer

Регистрация: Jun 2012
Сообщений: 6
Tools Геометрическая оптика

Здравствуйте. Вот уже третий день мучаюсь с построением изображения в собирающей линзе.
Есть точка, "оптический стол" и сама линза.
Нужно построить изображение по следующим правилам(я взял первые 2 правила, ибо третье кажется каким-то нереализуемым):
Цитата:
1.Луч, проходящий через оптический центр линзы, не преломляется.
2.Луч, падающий на линзу параллельно главной оптической оси, при выходе из линзы проходит через её фокус
3.Луч, падающий под углом на линзу, при выходе из линзы проходит через точку, лежащую в фокальной плоскости линзы. Эта точка является пересечением вспомогательного луча, параллельного главному лучу и проходящего через оптический центр линзы и перпендикуляра поднятого(или опущенного) из фокуса к главной оптической оси.
Второе предложение в третьем правиле вообще не понял.

Так вот, я столкнулся с большим количеством вариантов решения этой задачи и выбрал два из них:

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 работаю впервые.

Старый 09.06.2012, 16:14
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 2  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Использовать уравнение тонкой линзы. 1/f = 1/a + 1/b, если не ошибаюсь
f - фокусное расстояние, a - расстояние от объекта (источника) до линзы, b - расстояние от линзы до изображения. Я бы сначала точки нашел а потом через них провел линии.

Зная f и a из уравнения легко b находится.


Последний раз редактировалось Silicium; 09.06.2012 в 17:43. Причина: дополнил ответ
Старый 09.06.2012, 16:41
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
∠CBD = 180 - ∠q
∠CDE = 360 - ∠CBD - ∠y
∠CDB = 180 - ∠CBD - ∠y
CB известна, углы известны, считаем треугольник CBD
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 09.06.2012 в 19:22. Причина: жара
Старый 09.06.2012, 17:52
Erikozer вне форума Посмотреть профиль Отправить личное сообщение для Erikozer Найти все сообщения от Erikozer
  № 4  
Ответить с цитированием
Erikozer

Регистрация: Jun 2012
Сообщений: 6
Цитата:
Сообщение от Silicium Посмотреть сообщение
Зная f и a из уравнения легко b находится.
Это понятно, а по y оси?

Цитата:
Сообщение от Wolsh Посмотреть сообщение
∠CBD = 180 - ∠q
∠CDE = 360 - ∠CBD - ∠y
CB известна, углы известны, считаем треугольник CBD
∠CDE = 360 - ∠CBD - ∠y
Почему тут 360? Сумма углов в треугольнике = 180 градусов, получается
∠CDE = 180 - 90 - ∠y => ∠CDE = 90 - ∠y
Треугольник CBD не рассматриваем.
Только не совсем понимаю, зачем нам углы.

Старый 09.06.2012, 19:08
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
360 забудьте, ага. Жара. И не ∠CDE а ∠CDB )))
Цитата:
Треугольник CBD не рассматриваем. Только не совсем понимаю, зачем нам углы.
Ну дело Ваше. Я думал Вас интересует гипотенуза CD, по которой собственно решается весь прямоугольный треугольник CED.
Вам ведь катеты найти надо, а у Вас кроме углов ничего нет. Решаем треугольник CBD — получаем гипотенузу, и зная углы, находим катеты в CED — т.е. координаты точки D.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 09.06.2012 в 19:17.
Старый 09.06.2012, 19:56
Erikozer вне форума Посмотреть профиль Отправить личное сообщение для Erikozer Найти все сообщения от Erikozer
  № 6  
Ответить с цитированием
Erikozer

Регистрация: Jun 2012
Сообщений: 6
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Ну дело Ваше. Я думал Вас интересует гипотенуза CD, по которой собственно решается весь прямоугольный треугольник CED.
Значит ∠CBD = 180 - ∠q
∠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.
Старый 09.06.2012, 21:01
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 7  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
По у через Г - увеличение линзы, равное -f/a; тоесть если координата источник y, то y' = -y*f/a Все просто

Старый 09.06.2012, 21:28
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 8  
Ответить с цитированием
maxkar

Регистрация: 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.

Старый 10.06.2012, 12:22
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 9  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Да вы издеваетесь! 1/f = 1/a + 1/b - вот это и есть ОБЩЕЕ решение. Зачем решать решенную задачу?

Старый 10.06.2012, 23:40
Erikozer вне форума Посмотреть профиль Отправить личное сообщение для Erikozer Найти все сообщения от Erikozer
  № 10  
Ответить с цитированием
Erikozer

Регистрация: Jun 2012
Сообщений: 6
Пробую пока через формулу 1/f = 1/a + 1/b
Вроде так получается, но проблема с координатами, точнее откуда должно считать.

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:51.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.