Trooper
|
Ajuda com Geometria
22-05-07, 21:18
#1
Estou com um problema do tamanho de um bonde aqui , então sei que tem um pessoal que faz matemática aqui e queria saber se alguem pode me ajudar?
Seguinte, tenho um poligono ou triangulo 3D. Então preciso saber como pegar a coordenada Z de um ponto (x,y) que está sobre ele... Os valores que eu tenho são as coordenadas dos 3 vertices do poligono, e as coordenadas (x,y) do ponto... |
||||
Trooper
|
22-05-07, 21:32
#2
Se vc tem um ponto x,y na base do triangulo 3D, forma um novo triangulo 2D, onde a largura da base desse novo triangulo vai ser a distância de um dos vértices até o ponto x,y. Então calcula a altura desse triângulo 2D, pronto, vc tem a coordenada Z do ponto.
|
Trooper
|
22-05-07, 21:43
#3
Ajuda com GEOMETRIA ANALITICA para começar .
Agora vou aqui resgatar umas formulas |
Ewok
|
22-05-07, 21:54
#4
;D |
Trooper
|
22-05-07, 21:56
#5
|
Trooper
|
22-05-07, 21:58
#6
Alí onde está (y,0,0) é (0,y,0), terno ordenado...
|
Trooper
|
22-05-07, 22:00
#7
Nada a ver o q eu postei, hehehe, mas blz!
|
Pit
|
22-05-07, 22:01
#8
Uma solução mais generica pra qualquer tipo de poligono é obtida através de visão robotica/visão computacional. Apesar de uma vez pronta servir pra qualquer coisa, definitivamente não é uma solução trivial.
Se não aparecer um modo mais simples me manda um email que nos trocamos ideia. [email protected] |
Trooper
|
22-05-07, 22:04
#9
Explique-se melhor Pit! Como assim???
|
Pit
|
22-05-07, 22:27
#10
Visão Robótica/Visão Computacional é o estudo de algoritmos que conseguem recuperar informação 3d/2d a partir de outro conjunto limitado de dados.
São técnicas ultra potentes que conseguem recuperar dados praticamente do além. Mas por sua vez, são mto pesadas e complexas. hehe Eu fiz essa matéria, porém mais voltado pra obter informação a partir de fotos, mas creio que existe técnicas que ajudem o Landim. Por isso eu precisava conversar com ele caso não apareça solução melhor. Se tiver mto curioso, escreve no google: Computer Vision, Visão Robotica e etc. |
inativo
|
22-05-07, 22:42
#11
é fácil se você usar detecção de colisão, criando um vetor que tem origem no (x,y,0) e direção (0,0,1)
colide ele com teu triangulo... e ve o ponto |
inativo
|
22-05-07, 22:43
#12
isso é claro se você tiver certeza que teu triangulo ta do lado positivo do eixo Z hehe
|
Pit
|
22-05-07, 22:49
#13
Então, mas minha duvida principal é se ele quer isso a nível de programação ou resolução algébrica. ehehe
|
inativo
|
22-05-07, 22:54
#14
Colisão de plano com uma reta (vetor)
direcaoDaReta * -( normalPlano dot origemDaReta + normalPlano dot origemPlano[no seu caso pode ser qq uma dos 3 vertices eu acho] / normalPlano dot direçãoDaReta ) + origemDaReta ripei a fórmula de um algoritmo que eu achei aqui heuoheuoheuoehe acho mais seguro procurar no google só pra garantir :P é a fórmula de deteccao de colisao |
Trooper
|
22-05-07, 22:55
#15
eu teria que pensar pra responder. o max que posso fazer é um esboço:
chame de v1 = (x1,y1,z1) , v2 = (x2,y2,z2) e v3 = (x3,y3,z3) os vetores do R3 que representam os vertices do seu triangulo 1) encontre a equação do plano que passa por v1,v2,v3 (tal plano existe e é único) essa equação pode ser escrita na forma de uma geratriz com dois graus de liberdade: P = { (x,y,z) | z = f(x,y) }, para alguma função (linear) f 2) pronto. O ponto A tem coordenadas x_a, y_a, f(x_a, y_a). (Basta vc "plugar" os valores x_a e y_a que você obterá univocamente a coordenada z dada por f(x_a, y_a) |
Trooper
|
22-05-07, 22:57
#16
o que pega aí é como obter a eq. do plano quando dados v1,v2,v3
não lembro como faz. procura no wikipedia por PLANE ou senão vê em algum livro de geometria e vetores ou geometria analitica |
Forever Young
|
22-05-07, 22:57
#17
bando de nerds
|
Trooper
|
22-05-07, 23:04
#18
agreed roger
|
Trooper
|
23-05-07, 01:46
#19
Essa é facil. Primeira faz a equação do plano. Como? Encontra uma reta perpendicular ao plano. Como? Encontra dois vetores que pertencem ao plano. Como? assim ó
Definindo os vértices do triangulo: vertice 1 = (x1,y1,z1) vertice 2 = (x2,y2,z2) vertice 3 = (x3,y3,z3) Encontrando os vetores: V1 = (x1-x2,y1-y2,z1-z2) = (v1i, v1j, v1k) V2 = (x3-x2,y3-y2,z3-z2) = (v2i, v2j, v2k) Agora falta encontrar uma reta normal aos dois vetores, que será perpendicular ao plano tambem. Como? Produto Vetorial: V1 X V2 Ou seja, tem que encontrar o determinante da matriz | i j k | | v1i v1j v1k | | v2i v2j v2k | V3 = Det = ((v1j*v2k)-(v1k*v2j))i - ((v1i*v2k)-(v1k*v2i))j + ((v1i*v2j)-(v1j*v2i))k = (v3i, v3j, v3k) Pronto, essa tripa enorme é perpendicular ao plano em que o triangulo está situado. O que falta agora? Usar esse vetor e um ponto no plano pra descobrir a equação do plano. Bom, temos 3 pontos conhecidos no plano, os vertices do triangulo. Primeiro, a equação do plano: a(X-X0)+b(Y-Y0)+c(Z-Z0) = 0 onde x0,y0 e z0 são as coordenadas de um ponto conhecido no plano, e a,b e c são as componentes de um vetor perpendicular ao plano. Usando o vertice 2 do triangulo como ponto do plano e o vetor V3 calculado ali em cima como vetor perpendicular ao plano, temos: v3i(X-v2i) + v3j(Y-v2j) + v3k(Z-v2k) = 0 Daí é só usar essa equação e as coordenadas x e y do teu ponto misterioso, que vc descobre o z. Escrevendo de um jeito mais direto, usando as coordenadas dos vértices do triangulo explicitamente a equação fica assim: (((y1-y2)*(z3-z2))-((z1-z2)*(y3-y2)))*(X-(x3-x2)) - (((x1-x2)*(z3-z2))-((z1-z2)*(x3-x2)))*(Y-(y3-y2)) + (((x1-x2)*(y3-y2))-((y1-y2)*(x3-x2)))*(Z-(z3-z2)) = 0 Da próxima vez da os pontos direto pq achar essas coisas simbolicamente é um saco. |
Guest
|
23-05-07, 02:51
#20
Dah pra fazer usando notacao vetorial tb, o que pode facilitar ou dificultar dependendo do seu caso. A equacao do plano tambem pode ser escrita assim:
N.(R-P)=0 N eh o vetor normal (perpendicular) ao plano do triangulo. R eh um vetor qualquer (x,y,z) P eh um ponto que voce sabe com certeza que esta no plano ("O seu Vertice 1" por exemplo) To usando maiuscula pra vetores, e o ponto eh produto escalar. Um jeito de saber se o ponto A esta dentro do triangulo seria: a) Verificar se ele esta contido no plano b) Verificar se ele esta do lado de dentro do triangulo a) Pra verificar se ele esta contido no plano, primeiro agente acha a equacao geral do plano e depois verifica se o seu ponto A satisfaz a dita cuja. Exemplo: Para os pontos (indicados por vetores): V1=(1,-1,1) V2=(2,-2,2) V3=(2,0,3) Pra achar o vetor normal eh soh fazer o produto vetorial de dois vetores paralelos ao plano: V13=V3-V1=(1,1,2) V12=V2-V1=(1,-1,1) Esses sao vetores que correspondem a dois dos lados do seu triangulo certo? Entao: N=V12 x V13 = (3,1,-2) x indica produto vetorial Pra "P" eu escolhi o V1; P=V1=(1,-1,1) Entao a equacao do plano fica: (3,1,-2).(R-(1,-1,1))'=0 O "'" eh pra transpor o vetor resultante e deixar ele com as dimensoes certas pra multiplicacao. Se vc quer saber se um ponto esta contido no plano basta colocar ele como R. Pegando o ponto V3 por exemplo: (3,1,-2).(V3-(1,-1,1))'= (3,1,-2).((2,0,3)-(1,-1,1))'=(3,1,-2).(1,1,2))'=0 Como 0=0 o ponto tah no plano. b) Nao lembro de um jeito facil de saber se o tal ponto esta do lado de dentro ou do lado de fora do triangulo. Pra simplificar, o que voce pode fazer eh pegar soh a projecao em x,y e ver se A(x,y) esta dentro dele. Fontes: http://www.mat.ufmg.br/gaal/aulas_online/at4_02.html http://en.wikipedia.org/wiki/Plane_%28mathematics%29 http://en.wikipedia.org/wiki/Dot_product http://en.wikipedia.org/wiki/Vector_product PS: Acabei repetindo um monte de coisa que o colossus jah disse. ehahehhe |
Trooper
|
23-05-07, 08:59
#21
wtf
eaohaehioeau ODEIO GEOMETRIA ANALÍTICA! mas tenho que aprender né, fazer o que =P go go 3 anos sem entrar na facul! |
Back to the U.S.A.
|
23-05-07, 10:13
#22
geoanal (ou gel anal) sux
|
Trooper
|
23-05-07, 10:49
#23
ainda bem que nem precisei fazer nada já responderam
|
Trooper
|
23-05-07, 16:52
#24
eh isso mesmo q o colossus, disse, mas isso eh pra achar se o ponto estah no PLANO a qual o triangulo pertence
dae complementando, um jeito de saber se o ponto P pertence ao triangulo q possui vertices em T1, T2 e T3 eh: - somar o angulo formado pelos ponto Tx P Ty e verificar se deu 2pi (a soma dos angulos internos de um poligono CONVEXO em qq ponto pertencente ao poligono eh 2pi).. e eu nao sei como provar q achando 2pi, entao ele eh interno, mas confia em mim q funciona uhauhahuahua ae pra descobrir o angulo entre Tx P e Ty: - por exemplo: T1 e T2 no ponto P - vc vai ter o vetor PT1 e PT2, e quer descobrir o angulo entre eles.. pra isso, eh soh usar produto escalar.. formula de produto escalar entre u e v: u.v = |u| |v| cos a ae vc isola o cosseno e pega o arco cosseno pra descobrir a a = arccos( (u.v) / (|u||v|) ) - pronto, eh soh aplicar isso entre PT1 e PT2, PT2 e PT3, dps PT3 e PT1, somar, ver se deu 2pi \o/ PS: PRIMEIRO verifica se o ponto pertence ao plano, depois soma os angulos.. essa de somar angulo funciona em 2D, entao se o ponto nao pertencer ao plano, isso nao garante nada |
Trooper
|
23-05-07, 18:44
#25
É isso aí ZeroCaronte, nem sabia dessa soma q dá 2pi. Mas como ele tem só o x e o y do ponto, e não define o z, fica mais facil de ver se ele ta no triangulo fazendo uma projeção no plano xy, marcar os vertices e depois marcar o ponto. Se o ponto ficar dentro, ta dentro, senao, nao. ehauhea Mas se o cara disse que o ponto ta no triangulo, quem sou eu pra duvidar? heauehaua
Gamma, eu tive prova disso ano passado, e to usando essas coisas ainda. Tu fez todos os Calculos devia saber essas merdas aí tambem eahuehuae |
Trooper
|
23-05-07, 19:04
#26
uma vez eu resolvi um problemaço foda q nego postou aki
lembro q ate repercurtiu blz a resposta vou ver se acho pra pstar aki hehehe |
Trooper
|
23-05-07, 19:57
#27
e aí, já resolveram? Se tiverem resolvido nem vou me dar ao trabalho de postar.
|
Trooper
|
23-05-07, 20:02
#28
que coisa inútil
|
Trooper
|
23-05-07, 20:38
#29
AHHHHHHHH PUTZ
agora q eu li denovo oq ele queria saber, achei q ele quisesse saber SE o ponto esta dentro do triangulo dae a solução vira achar o plano (como o colossus jah disse), e depois achar a colisao entre o ponto (x,y) q vc tem com o plano q vc encontrou.. como fazer isso tah no post do bone (sendo q a direção tem q ser normalizada, se nao me engano, pra nao dar caca na hj do produto escalar) |
Trooper
|
23-05-07, 21:31
#30
Oz, nem é inútil, isso ae é praticamente a fórmula da vida pra muita coisa 3D...
Pit o preciso resolver o problema em nível de programação mesmo, estou tentando fazer algumas coisas em MaxScript, então acabou aparecendo esse problema ai, de todo jeito aparece no msn homem, você sumiu, até pensei você tinha me deletado, mas o churrasqueiro disse que parece que você está sumido mesmo... Colossus te amo cara \o/, ZeroCarontE também cara, ajudou bastante sim, complementou uma coisa que eu estava fazendo na base da gambiarra, maisinho para vocês, vou implementar ainda hoje. Só pude responder agora prq inventaram de colocar um proxy no meu trampo, e ele classifica a DS como site de game, sendo que muita coisa séria também se resolve aqui, foda Valeu caras. |
Trooper
|
25-05-07, 21:39
#31
Acho que viajei legal, mas seria isso?
Code:
protected Vector3 RetornaAltura(Vector3 vtPonto, Vector3 V1, Vector3 V2, Vector3 V3) { Vector3 VT1 = Vector3.Zero; Vector3 VT2 = Vector3.Zero; Vector3 VT3 = Vector3.Zero; //Encontrando os vetores: VT1.X = (V1.X - V2.X); VT1.Y = (V1.Y - V2.Y); VT1.Z = (V1.Z - V2.Z); VT2.X = (V3.X - V2.X); VT2.Y = (V3.Y - V2.Y); VT2.Z = (V3.Z - V2.Z); //V3 = V1 X V2 VT3.X = ((VT1.Y * VT2.Z) - (VT1.Z * VT2.Y)); VT3.Y = ((VT1.X * VT2.Z) - (VT1.Z * VT2.X)); VT3.Z = ((VT1.X * VT2.Y) - (VT1.Z * VT2.X)); Vector3 vtNovoPonto = Vector3.Zero; vtNovoPonto.X = vtPonto.X; vtNovoPonto.Y = vtPonto.Y; vtNovoPonto.Z = (((VT1.Y - VT2.Y) * (VT3.Z - VT2.Z)) - ((VT1.Z - VT2.Z) * (VT3.Y - VT2.Y))) * (vtPonto.X - (VT3.X - VT2.X)) - (((VT1.X - VT2.X) * (VT3.Z - VT2.Z)) - ((VT1.Z - VT2.Z) * (VT3.X - VT2.X))) * (vtPonto.Y - (VT3.Y - VT2.Y)) + (((VT1.X - VT2.X) * (VT3.Y - VT2.Y)) - ((VT1.Y - VT2.Y) * (VT3.X - VT2.X))) * (vtPonto.Z - (VT3.Z - VT2.Z)); return vtNovoPonto; } |
|
|