как построить дуги, которые пересекали бы прямую в заданных точках (38.2; 50.0; 61.

Очень интересно, а вот как это сделать никак не могу понять.
Заранее большое спасибо.
Я чессно уже не очень помню в чем там было дело - решил проблему и забыл. Вот код который рисует дуги, разбирайтесь:Grad писал(а):Могли бы вы объяснить теоретически (раз практически у вас получилось)
как построить дуги, которые пересекали бы прямую в заданных точках (38.2; 50.0; 61.
Очень интересно, а вот как это сделать никак не могу понять.
Заранее большое спасибо.
Код: Выделить всё
{-----Paint fibo-------------------------------------------------------------}
procedure TFiboArc.Paint;
var
i, x1, y1, x2, y2, dx, dy, ex1, ex2, ey1, ey2: integer;
date1, date2: TDateTime;
price1, price2, len, flen: double;
visible: boolean;
s: string;
begin
if not(assigned(fLine)) then
exit;
GetLinePoints(x1, y1, x2, y2, visible);
if not(visible) then exit;
GetLineAbsPoints(date1, price1, date2, price2);
with diagram.canvas do
begin
dx := ((x2 - x1) div 16)*integer(diagram.scale);
dy := round((price2 - price1)/fCurrency.MinPoint);
len := dx*dx + dy*dy;
if len > 0 then
len := sqrt(len);
for i:=0 to length(levels) - 1 do
begin
flen := len*levels[i].value/100;
dx := round(flen*16/diagram.scale);
ex1 := x2 - dx;
ex2 := x2 + dx;
ey1 := diagram.GetY(price2 - flen*fCurrency.MinPoint);
ey2 := diagram.GetY(price2 + flen*fCurrency.MinPoint);
pen.Color := levels[i].style.color;
pen.Style := levels[i].style.style;
pen.Width := levels[i].style.width;
font.Name := 'Arial';
font.Color := options.ColorScheme.FrameAndTextColor;
font.Style := [];
font.Height := 14;
s := levels[i].text;
if y1 < y2 then
begin
if ClosedEllipse then
ellipse(ex1, ey1, ex2, ey2)
else
arc(ex1, ey1, ex2, ey2, ex2, y2, ex1, y2);
TextOut(x2 - (TextWidth(s) div 2), ey2 - TextHeight('0'), s);
end
else
begin
if ClosedEllipse then
ellipse(ex1, ey1, ex2, ey2)
else
arc(ex1, ey1, ex2, ey2, ex1, y2, ex2, y2);
TextOut(x2 - (TextWidth(s) div 2), ey1 - TextHeight('0'), s);
end;
end;
end;
end;
Grad писал(а):Спасибо большое за код.
Но могли бы вы дать ряд следующих пояснений по нему:
1) в чем измеряются координаты линии x1 и x2? (я имею в виду пиксели, или индексы баров или может что-то еще?)
2) Какое значение имеет переменная diagram.scale, и правильно ли я понимаю, что fCurrency.MinPoint - это минимальное изменение валюты, пункт т.е. например 0.0001?
3) Интересно что за магическая цифра 16, на которую сначала делится искомый dx, а затем умножается?
Может быть следующие мои рассуждения натолкнут вас на подсказку мне же:
Все дело как я понимаю заключается в том чтобы найти искомый dx и dy - радиусы эллипса, а потом уже плюсуем к координатам центра эллипса эти значения и получаем то что требуется.
Так вот проблема в том что определенную часть(38.2; 50.0) - отрезок от линии вычислить можно, но ведь это не искомый dx, это то значение где эллипс должен пересечь прямую. А вот dx, другими словами первый радиус эллипса я не представляю как можно подсчитать?
Еще по коду интересен момент почему вы используете разнородные координаты для подсчета dx и dy (для dx - это x1,x2, для dy уже price1, price2, а не те же y1,y2)
Но ведь главное у вас все работает! Честно говоря глядя на то как вычисляется dx в коде и считаются координаты вывода эллипса ey1,ey2 я не понимаю как это работает, вы уж меня извините.
Надеюсь получить разъяснения по коду, может они до конца происнят ситуацию.
Таким образом получается, что вы определяете dx в барах, dy в пунктах, затем в этих разнородных координатах определяете длину линии. Потом ищете в зависимости от очередного уровня Фибоначи длину отрезка линии flen. И вот здесь начинается самое интересное.Terranin писал(а):насколько я сейчас вспоминаю код dx выходит в барах а dy в пунктах, дальше определяем хитрую длину линии уж не знаю в каких единицахи от нее вычисляем по пропорции расстояние dx и dy эллипса
Ага,Grad писал(а):Таким образом получается, что вы определяете dx в барах, dy в пунктах, затем в этих разнородных координатах определяете длину линии. Потом ищете в зависимости от очередного уровня Фибоначи длину отрезка линии flen. И вот здесь начинается самое интересное.Terranin писал(а):насколько я сейчас вспоминаю код dx выходит в барах а dy в пунктах, дальше определяем хитрую длину линии уж не знаю в каких единицахи от нее вычисляем по пропорции расстояние dx и dy эллипса
Этот отрезок flen, вычисленный в разнородных координатах, потом преобразованный назад в пиксели:
dx := round(flen*16/diagram.scale), он и становится в результате первым радиусом эллипса. А потом этот же отрезок используется для вычисления длины второго радиуса как его длина в пунктах.
Фантастика, но это действительно на практике работает. Но вот теоретически взглянув на код я бы никогда не сказал что дуги будут правильно рисоваться!
Еще раз спасибо за код!
Рекомендую почитать на досуге: http://gann.suTerranin писал(а):Ага,Grad писал(а):Таким образом получается, что вы определяете dx в барах, dy в пунктах, затем в этих разнородных координатах определяете длину линии. Потом ищете в зависимости от очередного уровня Фибоначи длину отрезка линии flen. И вот здесь начинается самое интересное.Terranin писал(а):насколько я сейчас вспоминаю код dx выходит в барах а dy в пунктах, дальше определяем хитрую длину линии уж не знаю в каких единицахи от нее вычисляем по пропорции расстояние dx и dy эллипса
Этот отрезок flen, вычисленный в разнородных координатах, потом преобразованный назад в пиксели:
dx := round(flen*16/diagram.scale), он и становится в результате первым радиусом эллипса. А потом этот же отрезок используется для вычисления длины второго радиуса как его длина в пунктах.
Фантастика, но это действительно на практике работает. Но вот теоретически взглянув на код я бы никогда не сказал что дуги будут правильно рисоваться!
Еще раз спасибо за код!я уже не помню в чем была идея но она работает.