Задать вопрос
Dimentre
@Dimentre
Начинающий

Как убрать линию, соединяющую (0,0) и начало графика ln(x) Tcanvas?

Доброго времени суток!
Столкнулся с проблемой, когда начал осваивать построение графиков в delphi. Дело в том, что захотел попробовать построить график ln(x) канвасом, но у ln'a есть ограничение x>0, и делфи строит линию, от начала координат в image до того самого значения в x>0. Как от неё избавиться и оставить только график ln'a??
Вот сам код
procedure TForm1.Button5Click(Sender: TObject);
const mash=10;
Var x0,y0:integer;
x,y:real;
begin
x0:=image2.Width div 2;
y0:=image2.Height div 2;
// рисуем ось
image2.canvas.pen.color:=clgray;
image2.canvas.pen.width:=2;
image2.Canvas.MoveTo(x0,0);
image2.Canvas.LineTo(x0,clientheight);
image2.canvas.moveto(0,y0);
image2.Canvas.lineto(clientwidth,y0);
//рисуем график
image2.Canvas.Pen.Color:=clred;
x:=0;
image2.canvas.moveto(trunc(x),trunc(y));
repeat
x:=x+0.001;
if x <= 0 then
y := 0
else
y:=-ln(x);
image2.canvas.lineto(trunc(x*mash)+x0,trunc(y*mash)+y0);
until x>=50;
end;

Собственно сама картинка
d74b426132de42f7aaec969109c1d3e2.png
Заранее спасибо за помощь!)
  • Вопрос задан
  • 422 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Прямые причины этого отрезка.
1. В первом MoveTo ты спутал реальные и экранные координаты. И в первом графике, видимо, тоже, только там линия уходит влево за край.
2. У тебя нет никакой логики поведения на разрывах. В простейшем случае — в первую точку MoveTo, а не LineTo.

И прочие ошибки.
3. Не инициализирован y.
4. Ты рисуешь не на том холсте. Видимо, ты хотел забуферизировать графики — но графики не отпечатываются на картинке, а рисуются на холсте формы. Как только ты минимизируешь-восстановишь прогу, графики исчезнут. Надо рисование либо в событие OnPaint (тогда график будет перестраиваться каждый раз при перерисовке), либо отпечатать на Picture.Bitmap (график останется отпечатанным на картинке). Во втором случае не забудь image2.Invalidate (отложенно перерисовать, когда это станет возможным);
5. Шаг слишком мал. Это должен быть эквивалент одного или двух пикселей.

ПРИМЕЧАНИЕ ПО ПОВОДУ 4. В WinVista+ с включенным Aero может быть всё в порядке (Aero буферизирует окна, чтобы работал Aero Flip и прочее). Выключи Aero, и будет обычный «хардкор» Windows: ничего не запоминает, а когда потребуется, перерисовывает.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
if x <= 0 then
y := 0
заменить на
if x <= 0 then
y := 9999
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы