Pascal/Turbo Pascal - Ayuda con este problema..

 
Vista:
Imágen de perfil de Jean Carlos

Ayuda con este problema..

Publicado por Jean Carlos (13 intervenciones) el 16/12/2016 23:28:17
Me asignaron realizar este programa:

Diseñe un programa que calcule cuántos y cuáles
puntos de coordenadas enteras existen dentro de un
triángulo del que se conocen las coordenadas de sus
vértices.

pero no entiendo como podria hacer para derteminar los puntos de coordenadas enteras dentro del triangulo, lo que llevo hecho es la verificacion para cuando el usuario ingrese las coordenadas sean de un triangulo, lo que no se es como calcular esos puntos que piden, agradeceria mucho su ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
program Project1;
Var x1,Y1,X2,Y2,X3,Y3:Integer;
    a,b,c:extended;
 
begin
  Writeln('Ingrese coordenada x1: ');
  Readln(x1);
  Writeln('Ingrese coordenada y1: ');
  Readln(y1);
  Writeln('Ingrese coordenada x2: ');
  Readln(x2);
  Writeln('Ingrese coordenada y2: ');
  Readln(y2);
  Writeln('Ingrese coordenada x3: ');
  Readln(x3);
  Writeln('Ingrese coordenada y3: ');
  Readln(y3);
 
  Writeln('El cateto "a" del triangulo es: ');
  a:=(sqrt(sqr(X2-X1)+sqr(Y2-Y1)));
  Writeln(a:0:0);
  Writeln('El cateto "b" del triangulo es: ');
  b:=(sqrt(sqr(X3-X2)+sqr(Y3-Y2)));
  Writeln(b:0:0);
  Writeln('La hipotenusa "c" del triangulo es: ');
  c:=(sqrt(sqr(X3-X1)+sqr(Y3-Y1)));
  Writeln(c:0:0);
 
  If (a+b<c) or (a+c<b) or (b+c<a) Then
  Writeln('Las coordenadas no pueden formar un triangulo')
  else
  Writeln('Las coordenadas forman un triangulo');
  Readln;
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ayuda con este problema..

Publicado por Suarez (1 intervención) el 28/12/2016 22:40:26
Hola Jean Carlos! :D Feliz Navidad
Para que el programa te mostrara los puntos y te determinara la cantidad tenias que:
1.- Verificar que los puntos suministrados por el usuario formaran un triangulo (Lo cual hiciste, bien :))
2.- Ordenar las coordenadas x y y de menor a mayor (Identificadas como p1,p2,p2,q1,q2,q3 en el código).
3.- Usar la función Trunc para que p1,p3,q1,q3 este sin su parte decimal y usarlo en en el ciclo for.
4.- Ciclos for para que generaran puntos que abarcaran el dominio y rango del triangulo
5.-Condicionales if para que mostraran solo los puntos que estarán dentro del triangulo y los contara (identificado como contador en el código).

Ademas, comprobé si los puntos generados por los ciclos for están fuera o dentro del triangulo usando áreas.
Sea A:distancia del punto 1 con el punto 2
B: distancia del punto 2 con el punto 3
C: distancia del punto 3 con el punto 1
D: distancia del punto 1 con el punto a verificar
E: distancia del punto 2 con el punto a verificar
F: distancia del punto 3 con el punto a verificar
Si el punto esta dentro del triangulo las áreas que forman los triángulos ADE, BEF, CDF es igual al área generado por el triangulo ABC

Aquí te va el código. Saludos


program Project1;
uses
Sysutils, crt, math;

Var
i,j,ri,rf,si,sf,contador:integer; aux1,aux2,p1,p2,p3,q1,q2,q3,area,s,s1,s2,s3,A1,A2,A3,a,b,c,d,e,f,x1,y1,x2,y2,x3,y3:extended;

begin
Writeln('Ingrese coordenada x1: ');
Readln(x1);
Writeln('Ingrese coordenada y1: ');
Readln(y1);
Writeln('Ingrese coordenada x2: ');
Readln(x2);
Writeln('Ingrese coordenada y2: ');
Readln(y2);
Writeln('Ingrese coordenada x3: ');
Readln(x3);
Writeln('Ingrese coordenada y3: ');
Readln(y3);

a:=sqrt(sqr(x2-x1)+sqr(y2-y1));
b:=sqrt(sqr(x3-x2)+sqr(y3-y2));
c:=sqrt(sqr(x1-x3)+sqr(y1-y3));
s:=(a+b+c)/2;
area:= sqrt(s*(s-a)*(s-b)*(s-c));

if (a+b<c) or (a+c<b) or (b+c<a) then
writeln('Las coordenadas que usted introdujo no pueden formar un triangulo.')
else
begin
P1:=x1;
P2:=x2;
P3:=x3;
q1:=y1;
q2:=y2;
q3:=y3;
if (p3>p1) and (p3>p2) then
begin
if (p2<p1) then
begin
aux1:=p2;
p2:=p1;
p1:=aux1;
end;
end
else
begin
if (p2>p3) and (p3>p1) then
begin
aux1:=p2;
p2:=p3;
p3:=aux1;
end
else
begin
if (p1<p3) and (p3>p2) then
begin
aux1:=p1;
p1:=p3;
p3:=aux1;
end
else
begin
aux1:=p1;
p1:=p3;
p3:=aux1;
if p2<p1 then
begin
aux1:=p2;
p2:=p1;
p1:=aux1;
end;
end;
end;
end;

if (q3>q1) and (q3>q2) then
begin
if (q2<q1) then
begin
aux2:=q2;
q2:=q1;
q1:=aux2;
end;
end
else
begin
if (q2>q3) and (q3>q1) then
begin
aux2:=q2;
q2:=q3;
q3:=aux2;
end
else
begin
if (q1<q3) and (q3>q2) then
begin
aux2:=q1;
q1:=q3;
q3:=aux2;
end
else
begin
aux2:=q1;
q1:=q3;
p3:=aux2;
if q2<q1 then
begin
aux2:=q2;
q2:=q1;
q1:=aux2;
end;
end;
end;
end;

si:=trunc(p1);
sf:=trunc(q1);
ri:=trunc(p3);
rf:=trunc(q3);

contador:=0;
for i:=si to ri do
for j:=sf to rf do
begin
d:=sqrt(sqr(x1-i)+sqr(y1-j));
e:=sqrt(sqr(x2-i)+sqr(y2-j));
f:=sqrt(sqr(x3-i)+sqr(y3-j));
s1:=(a+d+e)/2;
a1:=sqrt(s1*(s1-a)*(s1-d)*(s1-e));
s2:=(b+f+e)/2;
a2:=sqrt(s2*(s2-b)*(s2-f)*(s2-e));
s3:=(d+f+c)/2;
a3:=sqrt(s3*(s3-d)*(s3-f)*(s3-c));
if (abs(area-a1-a2-a3)<=1e-8) and (d<>0) and (e<>0) and (f<>0) then
begin
writeln('(',i,',',j,')');
contador:=contador+1;
end;
end;
writeln (' La cantidad de coordenadas enteras dentro del triangulo es:',contador);
end;

writeln;
writeln;
write(' Presione ENTER para terminar...');
readln;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar