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
por 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

-
- Mensagens: 121
- Registado: Quarta Mar 23, 2005 10:05
- Localização: Lisboa
por 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
-

Dani
- Membro de Prata

-
- Mensagens: 287
- Registado: Quinta Mai 12, 2005 20:00
por 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....
-
Taxus
- Membro de Ouro

-
- Mensagens: 946
- Registado: Quarta Set 11, 2002 3:33
-
por 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
-
Taxus
- Membro de Ouro

-
- Mensagens: 946
- Registado: Quarta Set 11, 2002 3:33
-
por 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

-
- Mensagens: 121
- Registado: Quarta Mar 23, 2005 10:05
- Localização: Lisboa
por Taxus » Domingo Out 30, 2005 10:55
Queres o script de matlab?
-
Taxus
- Membro de Ouro

-
- Mensagens: 946
- Registado: Quarta Set 11, 2002 3:33
-
por 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

-
- Mensagens: 121
- Registado: Quarta Mar 23, 2005 10:05
- Localização: Lisboa
por 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
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

-
- Mensagens: 121
- Registado: Quarta Mar 23, 2005 10:05
- Localização: Lisboa
por 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
-
Taxus
- 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 4 visitantes