Линия рисуется по следующему "закону":
for x := 1 to 10
y := tan(alpha)*x + b
Дойдя до конечного значения x, мы получаем некое значение y.
Затем происходит смена угла alpha на другое значение и вторая прямая рисуется по этому же "закону" y := tan(alpha2)*x + b
Интересует вопрос, как можно реализовать алгоритм, чтобы отрисовка второй линии начиналась с точки окончания первой, но уже шла под другим углом?
Получается так, что новая линия рисуется под нужным углом, но происходит смещение координат x и y.
Заранее благодарен!
soton пишет:
> Интересует вопрос, как можно реализовать алгоритм, чтобы отрисовка > второй линии начиналась с точки окончания первой, но уже шла под другим > углом?
Подобрать при старте второй линии и таким образом, чтобы y был равен в
этой точке, как для первой, так и для второй линии?
Здравствуйте, soton, Вы писали:
S>Линия рисуется по следующему "закону": S>for x := 1 to 10 S>y := tan(alpha)*x + b S>Дойдя до конечного значения x, мы получаем некое значение y. S>Затем происходит смена угла alpha на другое значение и вторая прямая рисуется по этому же "закону" y := tan(alpha2)*x + b S>Интересует вопрос, как можно реализовать алгоритм, чтобы отрисовка второй линии начиналась с точки окончания первой, но уже шла под другим углом? S>Получается так, что новая линия рисуется под нужным углом, но происходит смещение координат x и y.
Похоже у тебя неправильная постановка задачи.
Если у тебя известен угол alpha, b и длина линии по X, то и рисовать надо по другому.
Что-то вроде:
Canvas.MoveTo(X0, Y0);
DX := sign(cos(alpha)) * X; // Умножает X на направление движения
DY := tan(alpha)*x + b; // вычисляем смещение по y
Canvas.LineTo(X0 + DX, Y0 + DY);
Но скорее всего ты уперся в формулу, а задача стоит какая-то совсем другая
D>Похоже у тебя неправильная постановка задачи. D>Если у тебя известен угол alpha, b и длина линии по X, то и рисовать надо по другому. D>Что-то вроде: D>
D>Canvas.MoveTo(X0, Y0);
D>DX := sign(cos(alpha)) * X; // Умножает X на направление движения
D>DY := tan(alpha)*x + b; // вычисляем смещение по y
D>Canvas.LineTo(X0 + DX, Y0 + DY);
D>
D>Но скорее всего ты уперся в формулу, а задача стоит какая-то совсем другая
Главное, чтобы происходила прорисовка линий. По другой формуле уже врядли получится, так как под нее "заточен" основной код...
Здравствуйте, soton, Вы писали:
S>Главное, чтобы происходила прорисовка линий. По другой формуле уже врядли получится, так как под нее "заточен" основной код...
А в чём проблема-то? Считай в относительных координатах к последней точке.
Здравствуйте, soton, Вы писали:
D>>А в чём проблема-то? Считай в относительных координатах к последней точке.
S>Не могли бы предложить алгоритм?
Я уже предложил алгоритм. Покажи или расскажи где и как используется формула, иначе бессмысленно что-то предлагать.
Подозреваю, что пока ты зацикливаешься на формуле, самое главное мы тут все не понимаем и упускаем. А телепаты уже сюда почти не заходят ))
Здравствуйте, Dimonka, Вы писали:
D>Я уже предложил алгоритм. Покажи или расскажи где и как используется формула, иначе бессмысленно что-то предлагать. D>Подозреваю, что пока ты зацикливаешься на формуле, самое главное мы тут все не понимаем и упускаем. А телепаты уже сюда почти не заходят ))
По этой формуле строится луч. В программе необходимо проследить движение луча в некоторой геометрии (прямоугольник). При попадании его в прямоугольник, происходит преломление (по оптическому закону), т.е. смена угла распространения. При попадании в стенки (верхнюю, нижнюю и боковую (правую)) происходит его отражение (с этим проблем нет). Соответственно луч гуляет по прямоугольнику и вылетает из него. Это все реализовано. Теперь главная проблема, реализовать преломление.
Также считается пройденный путь луча. Путь луча нужен для расчета интенсивности излучения.
Здравствуйте, soton, Вы писали:
S>По этой формуле строится луч. В программе необходимо проследить движение луча в некоторой геометрии (прямоугольник). При попадании его в прямоугольник, происходит преломление (по оптическому закону), т.е. смена угла распространения. При попадании в стенки (верхнюю, нижнюю и боковую (правую)) происходит его отражение (с этим проблем нет). Соответственно луч гуляет по прямоугольнику и вылетает из него. Это все реализовано. Теперь главная проблема, реализовать преломление. S>Также считается пройденный путь луча. Путь луча нужен для расчета интенсивности излучения.
Мая плакать.. Лучь уже практически везде гуляет, а вопрос стоит о линии "по закону" y := tan(alpha2)*x + b. Какие проблемы с преломлением-то?
Показывай код.
Или лучше не показывай код. Лишний только стресс у всех будет.
Здравствуйте, soton, Вы писали:
S>Линия рисуется по следующему "закону": S>for x := 1 to 10 S>y := tan(alpha)*x + b S>Дойдя до конечного значения x, мы получаем некое значение y. S>Затем происходит смена угла alpha на другое значение и вторая прямая рисуется по этому же "закону" y := tan(alpha2)*x + b S>Интересует вопрос, как можно реализовать алгоритм, чтобы отрисовка второй линии начиналась с точки окончания первой, но уже шла под другим углом? S>Получается так, что новая линия рисуется под нужным углом, но происходит смещение координат x и y. S>Заранее благодарен!
Строишь Yn = f(Xn), для n = 1..10
Дальше вся хитрость прорисовки состоит в простом смещении центра координат в точку (X10, Y10) из точки (0, 0), т.е.
Ym = Y10 + f2(Xm — X10)
или в твоих терминах:
y = (tan(alpha)*10 + b) + tan(aplha2)*(x — 10) + b.