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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2019, 17:41   #31
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ну так продолжите ее за точки или вы не понимаете разницы между прямой и отрезком?
p51x вне форума Ответить с цитированием
Старый 06.03.2019, 17:47   #32
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Vitalik81311 Посмотреть сообщение
Код я приводил выше...
запакуйте *.pas *.dfm *.dpr (это исходники проекта) в архив, архив прикрепите к сообщению на форуме.

а по сути p51x абсолютно прав - нужно рисовать линию не от Q до P, а от одной видимой границы графика - до другой (пересечения линии с границами области графика). Ну и при изменении масштаба не забывать перерисовывать прямую.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.03.2019, 20:08   #33
Vitalik81311
Пользователь
 
Регистрация: 28.10.2018
Сообщений: 25
По умолчанию

Я пробовал провести от начала до конца, но тогда прямая чертится не через точки... подскажите, как это сделать ни как не пойму...?
Код:
//Описание глобальных переменных
var
  Form1: TForm1;
  x1,y1,x2,y2:real;
  x0,y0:integer;
xe,ye:integer;
x,y,A,B:real;
dx,dy:real;
Mx,My:real;
xmin,xmax,ymin,ymax:integer;
a1,a2,b1,b2:integer;
implementation

uses Unit2, Unit3, Unit4, Unit5, Unit6;

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
xmin:=-3; xmax:=4; ymin:=-8; ymax:=8;
a1:=10; a2:=257;
b1:=10; b2:=514;
x1:=StrToFloat(Edit1.Text);
y1:=StrToFloat(Edit2.Text);
x2:=StrToFloat(Edit4.Text);
y2:=StrToFloat(Edit5.Text);

if (x2<>x1) and (y2=y1) then begin
messagedlg('точки находятся параллельно оси абсцисс',mtInformation,[mbOk],0);
end;
if (x1<xmin) or (x1>xmax) or (y1>ymax) or (y1<ymin) then begin
messagedlg('введены не допустимые координаты точки Q, введите координаты входящие в предел',mtError,[mbOk],0);
end;
if (x2<xmin) or (x2>xmax) or (y2>ymax) or (y2<ymin) then begin
messagedlg('введены не допустимые координаты точки P, введите координаты входящие в предел',mtError,[mbOk],0);
end;
if (x2=x1) and (y2=y1) then begin
messagedlg('координаты точки Q и точки P совпали',mtInformation,[mbOk],0);
end;
if abs(x1-x2)<0.00001 then begin
messagedlg('прямая проходит параллельно оси Y, деление на ноль запрещено',mtInformation,[mbOk],0);
end;

 if abs(x1-x2)<0.00001 then  Label7.Caption :='коэффициент и'+#13'длину отрезка'+#13'найти нельзя'
 else  begin
 A:=(y1-y2)/(x1-x2);
 B:=y2-A*x2;
Label7.Caption :='коэффициент A= '+FloatToStr(A)+#13+'длина отрезка B= '+FloatToStr(B);
end;//Вывод информации
with PaintBox1.Canvas do
PaintBox1.Repaint;

end;

procedure TForm1.Button2Click(Sender: TObject);//Кнопка очистки графика
begin
Label7.Caption:='';
PaintBox1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Color:=ColorBox3.Selected;
xmin:=-3; xmax:=4; ymin:=-8; ymax:=8;//Минимальные и максимальные значения
a1:=10; a2:=257; //Приделы по оси ОХ
b1:=10; b2:=514; //Приделы по оси ОУ
a1:=a1-TrackBar1.Position; a2:=a2+5+TrackBar1.Position;
a1:=a1+ScrollBar1.Position; a2:=a2+ScrollBar1.Position;
b1:=b1-TrackBar1.Position; b2:=b2+8+TrackBar1.Position;
b1:=b1+ScrollBar2.Position; b2:=b2+ScrollBar2.Position;
dx:=1; dy:=1;//Шаг математической системы координат
with PaintBox1.Canvas do
begin
{Brush.Color:=clWhite;//Цвет кисти
Rectangle(-1,-1,PaintBox1.Width+1,PaintBox1.Height+1);//Прямоугольник}
Pen.width:=1;//Толщина линии
Pen.Color:=clBlack;//Цвет линии
Mx:=round((a2-a1)/(xmax-xmin));//Расчет масштаба по х
My:=round((b2-b1)/(ymax-ymin));//Расчет масштаба по у
x0:=a1-round(mx)*xmin;//Расчет начальной координаты х0
y0:=b1+round(my)*ymax;//Расчет начальной координаты у0
TextOut(a2-10,y0-15,'X');//Оцифровка математической координаты Х
TextOut(x0+5,b1+5,'Y');//Оцифровка математической координаты У
TextOut(x0+5,y0-18,'0');//Оцифровка нуля
Pen.width:=1;//Толщина линии
Pen.Style:=psDot;//Стиль линии
Pen.Color:=ColorBox2.Selected;//Цвет линии
x:=xmin;
repeat
Xe:=round(mx*(x-xmin)+a1);//Расчет экранной координаты Х
if CheckBox1.Checked=true then
begin
MoveTo(xe,b1);LineTo(xe,b2);//Линия сетки
end;
if x<>0 then TextOut(xe-5,y0+5,FloatToStr(x));//Оцифровка ОХ
x:=x+dx;
until(x>xmax);
y:=ymin;
repeat
Ye:=round(my*(-y+ymax)+b1);//Расчет экранной координаты У
if CheckBox1.Checked=true then
begin
MoveTo(a1,ye);LineTo(a2,ye);//Линия сетки
end;
if y<>0 then textOut(x0-20,ye-5,FloatToStr(y));//Оцифровка ОУ
y:=y+dy;
until(y>ymax);
Pen.Width:=2;//Толщина математических координат
Pen.Color:=ColorBox1.Selected;//Цвет математических осей координат
Pen.Style:=psSolid;//Стиль линий
MoveTo(a1,y0); LineTo(a2,y0);//Математическая координатная ось ОХ
MoveTo(x0,b1); LineTo(x0,b2);//Математическая координатная ось ОУ
//Pen.Color:=clBlack;
If Label7.Caption<>'' then
begin

Pen.Color:=clBlack;Pen.Width:=2;//Цвет и толщина точек
Ellipse( round(a1-mx*xmin+x1*mx)-3 ,round(b1+my*ymax-y1*my)-3,round(a1-mx*xmin+x1*mx)+3 ,round(b1+my*ymax-y1*my)+3);//Точка Q
TextOut(round(a1-mx*xmin+x1*mx)+5,round(b1+my*ymax-y1*my)-12,'Q');//Оцифровка точки Q
Ellipse( round(a1-mx*xmin+x2*mx)-3 ,round(b1+my*ymax-y2*my)-3,round(a1-mx*xmin+x2*mx)+3 ,round(b1+my*ymax-y2*my)+3);//Точка P
TextOut(round(a1-mx*xmin+x2*mx)+5,round(b1+my*ymax-y2*my)-12,'P');//Оцифровка точки P

 Pen.Color:=clBlue;Pen.Width:=1;//Цвет и толщина прямой
  {x2:=strtoint(edit4.Text);
y2:=strtoint(edit5.Text);}
MoveTo (round(a1-mx*xmin+x1*mx),round(b1+my*ymax-y1*my));
  {x1:=strtoint(edit1.Text);
y1:=strtoint(edit2.Text);}
LineTo(round(a1-mx*xmin+x2*mx),round(b1+my*ymax-y2*my));
end;
end;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Form2.ShowModal;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Form3.ShowModal;
end;



procedure TForm1.ColorBox1Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;

procedure TForm1.ColorBox2Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;

procedure TForm1.ColorBox3Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
PaintBox1.Repaint;
end;


procedure TForm1.N6Click(Sender: TObject);
begin
Form4.ShowModal;
end;

procedure TForm1.N5Click(Sender: TObject);
begin
Form5.ShowModal;
end;


procedure TForm1.TrackBar1Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;

procedure TForm1.N7Click(Sender: TObject);
begin
Form6.ShowModal;
end;

procedure TForm1.N9Click(Sender: TObject);
begin
close;
end;

procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
PaintBox1.Repaint;
end;

procedure TForm1.Edit1Change(Sender: TObject);//блокировка кнопки если не введены все данные
begin
if (Edit1.Text='') or (Edit2.Text='') or (Edit4.Text='') or (Edit5.Text='') then Button1.Enabled:=False
else Button1.Enabled:=True;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);//запрет в Edit ввода букв
begin
 case Key of
 '0'..'9',#8:; //кроме этого
 else Key:=chr(0);
 end;
end;

end.
Vitalik81311 вне форума Ответить с цитированием
Старый 06.03.2019, 20:54   #34
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

У тебя есть граничные значения для области, в которой рисуется графика.
Код:
a1:=10; a2:=257; //Приделы по оси ОХ
b1:=10; b2:=514; //Приделы по оси ОУ
Тебе известно положение начала системы координат, которые используются в этой области. У тебя есть положения точек, через которые должна пройти прямая.
Неужели сложно вычислить координату левой крайней точки, с которой надо рисовать линию, что бы она прошла и через заданные точки?


PS: Вспомнилось обсуждение вопроса о том, нужна ли программисту математика и физика ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.03.2019, 23:20   #35
Vitalik81311
Пользователь
 
Регистрация: 28.10.2018
Сообщений: 25
По умолчанию

А если я поменяю координаты точек...? Прямая будет проходить через другие точки...?
Vitalik81311 вне форума Ответить с цитированием
Старый 07.03.2019, 20:27   #36
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
Vitalik81311
А если я поменяю координаты точек...? Прямая будет проходить через другие точки...?
Координаты каких точек меняете?
Прямая всегда проходит через точки, а значит она проходит и через другие точки.
Вы сами поняли свой вопрос?

Вам предложили помощь в предыдущем посте, см. пост №32. Хотите получить результат?
Воспользуйтесь ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 09.03.2019, 18:19   #37
Vitalik81311
Пользователь
 
Регистрация: 28.10.2018
Сообщений: 25
По умолчанию

Подскажите пожалуйста, как это всё записать в виде кода, не пойму...?
Vitalik81311 вне форума Ответить с цитированием
Старый 09.03.2019, 18:23   #38
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Vitalik81311
У прямой линии есть 2 опорные точки. По ним находите уравнение прямой.
Потом берёте PaintBox1.ClientRect преобразуете в 4 отрезка которые образуют прямоугольник.
Далее вам надо взять уравнения вашей линии и сопоставить с уравнением линий painBox'а. Найдя точки в которых эти линии пересекаются вы найдёте точки для рисования.
Код:
  TSegment=record
    P0,P1:TPoint;
    end;
  TVector=TPoint;

  TQuadrilateral=record   
    P0, P1, P2, P3:TPoint;
    end;

function RectToQuadrilateral(Rect:TRect):TQuadrilateral;
begin
Result.P0:=Rect.TopLeft;
Result.P2:=Rect.BottomRight;
Result.P1.X:=Result.P2.X;
Result.P1.Y:=Result.P0.Y;
Result.P3.X:=Result.P0.X;
Result.P3.X:=Result.P2.Y;
end;

function Segment(P0, P1:TPoint):TSegment;
begin
Result.P0:=P0;
Result.P1:=P1;
end;

...
   Segment01:=Segment(Quadrilateral.P0, Quadrilateral.P1);
   Segment12:=Segment(Quadrilateral.P1, Quadrilateral.P2);
   Segment23:=Segment(Quadrilateral.P2, Quadrilateral.P3);
   Segment30:=Segment(Quadrilateral.P3, Quadrilateral.P0);
Далее пересечение прямых.
https://ru.wikipedia.org/wiki/Пересечение_прямых
http://www.delphiforfun.org/Programs...ting_lines.htm
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналитическая таблица Slavik7777 Фриланс 1 25.11.2018 19:08
Аналитическая программа Yosarien Общие вопросы C/C++ 2 13.02.2015 00:57
Аналитическая задача в Excel mezolit Фриланс 1 24.09.2012 15:28
Аналитическая геометрия (1 курс) Tigrika Помощь студентам 1 05.11.2010 00:06