16.05.2012, 16:38 | #1 (permalink) |
Member
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Программа на Паскале
Разработка программы «Треугольник и точка» Дана точка А(х, у). Определить, принадлежит ли она треугольнику с вершинами в точках (х1,у1), (х2, у2), (х3,у3). Сделать рисунок. |
16.05.2012, 16:38 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Содержимое этих обсуждений может помочь вам решить проблему Программа вычисления интеграла на Паскале Программа на паскале Программа в паскале, помогите, пожалуйста, исправить программу |
16.05.2012, 17:36 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
Var x1,x2,x3,y1,y2,y3,x,y,a,b,c,c1,c2,c3:Real; Sum:Integer; Function ArcCos(z:Real):Real; begin if Round(z*10000000)=10000000 then ArcCos:=0 else if Round(z*10000000)=-10000000 then ArcCos:=Pi else ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z)); end; Function RadGr(t:Real):Real; begin RadGr:=(t/Pi)*180; end; Function Angle(d1,d2,d3:Real):Real; begin Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2)); end; Begin Write('x1 = '); Readln(x1); Write('y1 = '); Readln(y1); Write('x2 = '); Readln(x2); Write('y2 = '); Readln(y2); Write('x3 = '); Readln(x3); Write('y3 = '); Readln(y3); a:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3)); b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3)); c:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2)); Writeln('Point:'); Write('x = '); Readln(x); Write('y = '); Readln(y); Writeln; c1:=Sqrt(Sqr(x-x1)+Sqr(y-y1)); c2:=Sqrt(Sqr(x-x2)+Sqr(y-y2)); c3:=Sqrt(Sqr(x-x3)+Sqr(y-y3)); Sum:=Round(RadGr(Angle(c1,c2,c)+Angle(c2,c3,a)+Angle(c1,c3,b))); Writeln(Sum=360); Readln; End. |
|
16.05.2012, 20:32 | #5 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
17.05.2012, 14:20 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну вот, как-то так. Только уж извините - с координатной сеткой возиться не стал. Очень много мороки.
Код:
Uses Graph, CRT; Var x1,x2,x3,y1,y2,y3,x,y,a,b,c,c1,c2,c3:Real; Sum:Integer; Xmax,Ymax,Xmin,Ymin,Kx,Ky:Real; Function ArcCos(z:Real):Real; begin if Round(z*10000000)=10000000 then ArcCos:=0 else if Round(z*10000000)=-10000000 then ArcCos:=Pi else ArcCos:=(Pi/2)-ArcTan(z/SQRT(1-z*z)); end; Function RadGr(t:Real):Real; begin RadGr:=(t/Pi)*180; end; Function Angle(d1,d2,d3:Real):Real; begin Angle:=ArcCos((Sqr(d1)+Sqr(d2)-Sqr(d3))/(d1*d2*2)); end; Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real); begin Vmin:=v1; if v2<Vmin then Vmin:=v2; if v3<Vmin then Vmin:=v3; if v4<Vmin then Vmin:=v4; Vmax:=v1; if v2>Vmax then Vmax:=v2; if v3>Vmax then Vmax:=v3; if v4>Vmax then Vmax:=v4; end; Begin Write('x1 = '); Readln(x1); Write('y1 = '); Readln(y1); Write('x2 = '); Readln(x2); Write('y2 = '); Readln(y2); Write('x3 = '); Readln(x3); Write('y3 = '); Readln(y3); a:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3)); b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3)); c:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2)); Writeln('Point:'); Write('x = '); Readln(x); Write('y = '); Readln(y); Writeln; c1:=Sqrt(Sqr(x-x1)+Sqr(y-y1)); c2:=Sqrt(Sqr(x-x2)+Sqr(y-y2)); c3:=Sqrt(Sqr(x-x3)+Sqr(y-y3)); Sum:=Round(RadGr(Angle(c1,c2,c)+Angle(c2,c3,a)+Angle(c1,c3,b))); Writeln(Sum=360); Writeln('Press "Enter" to show the picture...'); Readln; Search_MinMax(x1,x2,x3,x,Xmin,Xmax); Search_MinMax(y1,y2,y3,y,Ymin,Ymax); InitGraph(...); {ТУТ УЖ ВЫ САМИ} Kx:=0.8*GetMaxX/(Xmax-Xmin); Ky:=0.8*GetMaxY/(Ymax-Ymin); SetLineStyle(SolidLn,0,ThickWidth); MoveTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky)); LineTo(Round(0.1*GetMaxX+(x2-Xmin)*Kx),Round(0.9*GetMaxY-(y2-Ymin)*Ky)); LineTo(Round(0.1*GetMaxX+(x3-Xmin)*Kx),Round(0.9*GetMaxY-(y3-Ymin)*Ky)); LineTo(Round(0.1*GetMaxX+(x1-Xmin)*Kx),Round(0.9*GetMaxY-(y1-Ymin)*Ky)); Circle(Round(0.1*GetMaxX+(x-Xmin)*Kx),Round(0.9*GetMaxY-(y-Ymin)*Ky),2); ReadKey; CloseGraph; End. |
18.05.2012, 07:13 | #7 (permalink) | |
Member
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
02.06.2012, 12:24 | #8 (permalink) | |
Member
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
02.06.2012, 16:48 | #9 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Прежде всего, на чем основан алгоритм? А вот: соединим, как показано на рисунке в сообщении #2, проблемную точку (обозначим ее т.0) со всеми тремя вершинами треугольника. Теперь если т.0 находится внутри треугольника, то сумма углов с вершиной в т.0 составит 360°, если же вне - то меньше. Вот это и проверяется. Углы ищем по теореме косинусов. Но для этого нужно иметь функцию арккосинус, в списке стандартных функций Паскаля отсутствующую. Function ArcCos(z:real):Real; восполняет этот пробел. Проверять условие равенства суммы углов 360° удобнее, если углы выражены в градусах, а не в радианах. Перевод из радианов в градусы осуществляет функция Function RadGr(t:real):Real; Функция Function Angle(d1,d2,d3:real)Real; решает задачу нахождения значения угла между сторонами треугольника d1 и d2 по значению этих сторон, а также третьей d3, по теореме косинусов. И, наконец, о процедуре Procedure Search_MinMax(v1,v2,v3,v4:real; var Vmin:real; var Vmax:real); Смысл ее прост: из четырех чисел она находит наименьшее и наибольшее. Нужна она исключительно для оптимального размещения треугольника и точки т.0 на графическом экране, так, чтобы всё это во-первых, поместилось, а во-вторых, чтобы изображение не было мелким, смещенным в сторону и т.п., для чего и надо из координат трех вершин треугольника и точки т.0 найти наибольшую и наименьшую горизонтальные и вертикальные координаты, и уже исходя из них поставить "рамки" и определить масштабный коэффициент для построения изображения. Вот как-то так. Если еще вопросы появятся, задавайте. |
|
03.06.2012, 09:03 | #10 (permalink) | |
Member
Регистрация: 16.12.2011
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|