PASCAL - Funcao complicada!

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

PASCAL - Funcao complicada!

Mensagempor Ptsrc » Sábado Out 29, 2005 2:55

Boas

Epa gostaria de saber como fazer uma funcao ke dando as coordenadas dos 3 vertices de um triangulo e as coordenadas de um um ponto P retorna se esse ponto está no interior, exterior ou na fronteira desse triangulo!!!:?:


Ja estive a pensar nisso montes de tempo e não consigo ter uma solucao

Cumps
AMD Athlon 64 3800+ cooled by Zalman 7000B
AeroCool silver Line 550W
DFI Lanparty UT nF4 Ultra-D
Seagate Barracuda 7200.7 SATA 200 Gb
XFX NX6600GT TD128MB DDR3 (PCI-E)
Patriot PC3200 Low Latency (2x 512MB)
Thermaltake Armor VA8000BWS
Ptsrc
Membro de Prata
Membro de Prata
 
Mensagens: 121
Registado: Quarta Mar 23, 2005 10:05
Localização: Lisboa

Mensagempor Dani » Sábado Out 29, 2005 10:32

Boas

Tenta esta solução: usa dois ciclos for encadeados, um para a cordenada x e outro para a cordenada y. Com isto percorres as coordenadas todas entre os 3 pontos pedidos ao utilizador. Depois com um if comparas e ves se o valor for maior está fora se não está dentro, do triagulo, se for igual está na fronteira.
Esquecim-me no inicio tens de comparar, para saber qual a maior e qual a menor, para saber qual a condição a por no ciclo for.

Não estou certo que resulte, mas não custa tentar.

Cumps
Avatar do Utilizador
Dani
Membro de Prata
Membro de Prata
 
Mensagens: 287
Registado: Quinta Mai 12, 2005 20:00

Mensagempor Taxus » Sábado Out 29, 2005 20:18

Dano, a tua solução não funciona. Funcionaria se estivessemos a falar de quadrados.
O facto de o ponto estar entre o minimo e maximo das coordenadas X e Y do triânulo não significa que ele esteja dentro desse mesmo triangulo.
Do ponto de vista de programação correcta, o melhor algoritmo é verificar se "o ponto e cada um dos vertices pertencerem ao mesmo semiplano, dos dois semiplanos determinados pela recta definida pelos outros dois vertices" (Tirado do livro Programação com Classes em C++)
Esta solução é complicada porque tinhas que fazer funções que te calculassem de que lado de um semi-plano esta um ponto.

Uma alternativa barata e que funciona se fôr usada com cuidado é:
Se tiveres um ponto dentro de um triângulo, podes formar três triangulos mais pequenos com esse novo vertice.... A area total desses três triangulos é igual à area do triangulo inicial SE E SÓ SE o ponto estiver dentro do triangulo.
Penso que é bastante facil de perceber
Como programar isto?

Seja V1, V2,V3 os vertices e A1 o ponto....

Escreve uma função que calcula a área de um triângulo Area = (Base * Altura)/2

Calcula a area do triângulo inicial

Calcula e soma as três áreas dos triangulos

Compara as duas áreas

A unica dificuladade é achar a altura de cada triângulo, q sinceramente agora n estou a ver como se faz

Editado: Um algoritmo para calcular a altura de um triangulo não é assim tão simples afinal....
Usa a primeira maneira que te disse....
KaoS Contingency UT2k4 clan
http://www.kaos-eu.com/
Msn Taxus@netvisao.pt
Taxus
Membro de Ouro
Membro de Ouro
 
Mensagens: 946
Registado: Quarta Set 11, 2002 3:33

Mensagempor Taxus » Sábado Out 29, 2005 20:51

Ptsrc estou a escrever um script em Matlab que faz o que queres....
Agora vou pos copos mas logo quando chegar posto o codigo
KaoS Contingency UT2k4 clan
http://www.kaos-eu.com/
Msn Taxus@netvisao.pt
Taxus
Membro de Ouro
Membro de Ouro
 
Mensagens: 946
Registado: Quarta Set 11, 2002 3:33

Mensagempor Ptsrc » Domingo Out 30, 2005 1:37

Boas

Epa obrigadao pela ajuda ke tem dado.

Cumps
AMD Athlon 64 3800+ cooled by Zalman 7000B
AeroCool silver Line 550W
DFI Lanparty UT nF4 Ultra-D
Seagate Barracuda 7200.7 SATA 200 Gb
XFX NX6600GT TD128MB DDR3 (PCI-E)
Patriot PC3200 Low Latency (2x 512MB)
Thermaltake Armor VA8000BWS
Ptsrc
Membro de Prata
Membro de Prata
 
Mensagens: 121
Registado: Quarta Mar 23, 2005 10:05
Localização: Lisboa

Mensagempor Taxus » Domingo Out 30, 2005 10:55

Queres o script de matlab?
KaoS Contingency UT2k4 clan
http://www.kaos-eu.com/
Msn Taxus@netvisao.pt
Taxus
Membro de Ouro
Membro de Ouro
 
Mensagens: 946
Registado: Quarta Set 11, 2002 3:33

Mensagempor Ptsrc » Domingo Out 30, 2005 12:59

Boas

Pa se me puderes arranjar isso agradeço bue.


Cumps
AMD Athlon 64 3800+ cooled by Zalman 7000B
AeroCool silver Line 550W
DFI Lanparty UT nF4 Ultra-D
Seagate Barracuda 7200.7 SATA 200 Gb
XFX NX6600GT TD128MB DDR3 (PCI-E)
Patriot PC3200 Low Latency (2x 512MB)
Thermaltake Armor VA8000BWS
Ptsrc
Membro de Prata
Membro de Prata
 
Mensagens: 121
Registado: Quarta Mar 23, 2005 10:05
Localização: Lisboa

Mensagempor Ptsrc » Quarta Nov 02, 2005 0:18

Boas

Bem depois de muito pensar e pesquisar pela net ja arranjei solucao (à dois dias atras). Depois se alguem estiver interessado no codigo eu posto :D


Cumps
AMD Athlon 64 3800+ cooled by Zalman 7000B
AeroCool silver Line 550W
DFI Lanparty UT nF4 Ultra-D
Seagate Barracuda 7200.7 SATA 200 Gb
XFX NX6600GT TD128MB DDR3 (PCI-E)
Patriot PC3200 Low Latency (2x 512MB)
Thermaltake Armor VA8000BWS
Ptsrc
Membro de Prata
Membro de Prata
 
Mensagens: 121
Registado: Quarta Mar 23, 2005 10:05
Localização: Lisboa

Mensagempor Taxus » Quarta Nov 02, 2005 16:32

Só hoje é q me lembrei de ti!
O código deve ser qq coisa deste género
Código: Seleccionar todos
%Vertices V1, V2, V3
%Ponto A1
%Primeira recta -> Vertices V1-V2
m1=(V2(2)-V1(2))/(V2(1)-V1(1))
b1= V1(2)- (V2(2)-V1(2))/(V2(1)-V1(1))*V1(1)

%Segunda recta -> Vertices V2-V3
m2=(V3(2)-V2(2))/(V3(1)-V2(1))
b2= V2(2)- (V3(2)-V2(2))/(V3(1)-V2(1))*V2(1)

%Terceira recta -> Vertices V3-V1
m3=(V1(2)-V3(2))/(V1(1)-V3(1))
b3= V3(2)- (V1(2)-V3(2))/(V1(1)-V3(1))*V3(1)

%Verifica se o ponto esta dentro ou fora
m1*A1+b1-1


A ultima linha tem q ser repetida 3 vezes.. dependendo do sinal o ponto estará à esquerda ou direita do semiplano... O POnto estara dentro do triângulo se estiverdo mesmo lado de todos os semiplanos
KaoS Contingency UT2k4 clan
http://www.kaos-eu.com/
Msn Taxus@netvisao.pt
Taxus
Membro de Ouro
Membro de Ouro
 
Mensagens: 946
Registado: Quarta Set 11, 2002 3:33


Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 5 visitantes

cron