Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2017, 22:30   #1
Ven0m
Новичок
Джуниор
 
Регистрация: 01.06.2017
Сообщений: 2
По умолчанию Модель оптической системы в Delphi

Доброго времени суток. Бадаюсь с этим проектом с февраля месяца в рамках курсового проектирования(мои наработки во вложении полностью)... Немного о проекте, необходимо создать модель оптической системы с линзой и проходящим через неё лучом. По моей задумке на форме в Edit задаём радиус кривизны линзы r и при нажатии на кнопку на image, появляется изображение линзы в соответствии с заданным радиусом(вот тут и первая ошибка у меня, при задании положительного радиуса вырисовывается линза выгнутая в сторону в которую она должна быть выгнута с отрицательным радиусом). Теперь луч... Ход луча задается углом(значение которого также вводится в Edit) от оптической оси и расстоянием до линзы, после чего он проходит через линзу и преломляется к оптической оси с другой стороны линзы, все это происходит так же при нажатии уже другой кнопки. С лучом проблема следующая при изменении в Edit угла не получается ограничить его линзой, он либо не доходит до нее, либо наоборот уходит за нее, а необходимо сделать так чтобы он менял своё направление только при соприкосновение с линзой.
Вложения
Тип файла: rar основная.rar (324.3 Кб, 12 просмотров)
Ven0m вне форума Ответить с цитированием
Старый 02.06.2017, 04:01   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

По-поводу 1-й ошибки.
Я не понял, что значит "радиус кривизны"...
Или это:

0.png


Или это (но здесь на форму влияет не "r", а "с" - когда "c=0", то мы видим обычный круг, а когда отличное от нуля - появляется "несимметричная кривизна"):

3.png
2.png

Попробуй у себя оба кода; изменяй ключевые параметры - смотри, что меняется (меняй не только знаки, но и значения - потому что линза не статическая, а от значения параметров - "гуляющая");
попробуй сопоставить с ручным расчётам и рисунком, которое сделай предварительно...
Нарисуй саму линзу и расставь где "r" и другие параметры...

Покажи, что сделал/понял (лучше рисунками); делай скиншоты экрана...

Последний раз редактировалось ura_111; 02.06.2017 в 04:29.
ura_111 вне форума Ответить с цитированием
Старый 02.06.2017, 21:00   #3
Ven0m
Новичок
Джуниор
 
Регистрация: 01.06.2017
Сообщений: 2
По умолчанию

ura_111 спасибо что откликнулся, но это не совсем то что мне нужно. Предложенные тобой варианты уже были мной разработаны(имеется в виду подобные) ещё в то время когда я только начинал делать данный продукт. Радиус кривизны это радиус окружности из которой и получается дуга, соответственно в зависимости от того какой радиус задан, такую линзу программа и строит. Обрати внимание на мою программу которую я кинул во вложение, линза у меня привязана к конкретному месту и при изменении параметров(а именно радиуса) она просто меняет свою форму, но при этом никуда не сдвигается ни сама линза ни оптическая ось относительно которой она строится.
Ven0m вне форума Ответить с цитированием
Старый 02.06.2017, 22:38   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

"Радиус кривизны это радиус окружности из которой и получается дуга"

Не получается так! У тебя в первую очередь...
Заметь, сейчас я буду рассматривать не влияние знака радиуса на форму линзы (твою проблему №1),
а вообще, саму твою дугу (в которой ты свято уверен, что с ней всё ОК)...

Рассмотрим линзу с радиусом r=50 (пока просто нарисуем, а позднее - в программе простоем):

1.png

Обрати внимание на соотношение круга и длинны (расстояния между прямыми) 280 - КРУГ ВООБЩЕ НЕ ПЕРЕСЕКАЕТ ИХ!
"При чём тут 280?" -спросишь ты.

Добавив код тебе в программу:
Код:
 Image1.Canvas.MoveTo(0,60);
 Image1.Canvas.LineTo(1000,60);

 Image1.Canvas.MoveTo(0,340);
 Image1.Canvas.LineTo(1000,340);
получаем:

2.png


Как это возможно?
Вот если бы я задал радиус больше 150 (а не 50-ть), тогда да, - могло бы быть (обращай внимание на 280):

3.png

Для примера, покажу результат моего кода (1-й который был):

4.png


А теперь посмотри сюда (при отступе " по y=60" и радиусе 140):

5.png

- Идеально сошлось!
Другими словами, вот это и есть - какой радиус ввёл то и получил...
А у тебя?
Ввожу радиус 50, а мне рисует линзу с радиусом более 150...
ВОЗЬМИ ПО-ЭКСПЕРИМЕНТИРУЙ СО СВОИМ КОДОМ...

p.s.: что можешь сказать по этому поводу?
И что такое "с=100" в твоём коде?
Почему дуга (в проекции это хорда) именно такой имеет размер?
Может быть есть два радиуса: дуги и кривизны линзы? (я реализовал это во 2-м коде). Т.е.:

7.jpg

Последний раз редактировалось ura_111; 03.06.2017 в 02:05.
ura_111 вне форума Ответить с цитированием
Старый 04.06.2017, 04:07   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
const
  optical_axis = 200;
  lens_position = 400;
  lens_height = 100;

procedure TForm1.Button1Click(Sender: TObject);
var
  r, x: real;
begin
  r := -StrToFloat(Edit1.Text);
  Image1.Canvas.MoveTo(10, optical_axis);
  Image1.Canvas.LineTo(1000, optical_axis);
  x := lens_position - r;
  if abs(r) >= lens_height / 2 then
    x := x + sign(r) * sqrt(r * r - lens_height * lens_height / 4);
  Image1.Canvas.Arc(round(lens_position - 2 * r), round(optical_axis - r),
    round(lens_position), round(optical_axis + r), round(x),
    round(optical_axis + sign(r) * min(lens_height / 2, abs(r))), round(x),
    round(optical_axis - sign(r) * min(lens_height / 2, abs(r))));
end;
Рисование линзы с ограничением по размеру.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 04.06.2017 в 04:10.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Opengl C++ модель солнечной системы Shade2015 Помощь студентам 3 08.05.2015 21:09
модель сосредоточенной системы natasha9 Помощь студентам 1 23.05.2013 18:54
Модель солнечной системы (Deiphi) hanna Помощь студентам 11 31.03.2012 17:12
2D модель солнечной системы GaLiof Помощь студентам 9 12.11.2009 17:45