Школоло / Говнокод #6797 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
procedure rayxtriangle(Xa,Ya,Za, {Точка отправления луча}
                                    X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3 : real; {Координаты полигона (триангла)}
                                    Vx,Vy,Vz : real;{Вектор направления луча} Var Xc,Yc,Zc : real;{Точка пересечения}
                                    bol : boolean {Для проверки пересечения триангла});
Var A,B,C,D : real;
      k : real;
      ac1,ac2,ac3 : real;
begin
  A:=(Y2-Y1)*(Z3-Z1)-(Z2-Z1)*(Y3-Y1); //Вычисляем вектор нормали к треугольному полигону (векторное произведение)
  B:=(Z2-Z1)*(X3-X1)-(X2-X1)*(Z3-Z1);
  C:=(X2-X1)*(Y3-Y1)-(Y2-Y1)*(X3-X1);
  D:=-A*X1-B*Y1-C*Z1;
  k:=-(A*Xa+B*Ya+C*Za+D)/(A*Vx+B*Vy+C*Vz); //поскольку вектора луча (Vx Vy Vz) и вектор с даной
                                                                              //точки к точке пересечения (Xc-Xa, Yc-Ya, Zc-Za) - колинеарны
                                                                              //ето соотношение выведено мною, обьяснение было раньше (в предыдущем ответе)
  Xc:=k*Vx+Xa; //Вычисляем точку пересечения луча с полигоном
  Yc:=k*Vy+Ya;
  Zc:=k*Vz+Za;
                        //здесь проверяем лежыт ли даная точка в треугольном полигоне
                        //ac1,ac2,ac3 арккосинусы углов между векторами с точки пересечения (Xc Yc Zc)
                        //к вершинам треугольника (из скалярного произведения) 
                        //Для других полигонов (4,5,6... и т.д. угольных) надо побольше вычислений 
  ac1:=arccos(((x1-xc)*(x2-xc)+(y1-yc)*(y2-yc)+(z1-zc)*(z2-zc))/(sqrt(sqr(x1-xc)+sqr(y1-yc)+sqr(z1-zc))*sqrt(sqr(x2-xc)+sqr(y2-yc)+sqr(z2-zc))));
  ac2:=arccos(((x2-xc)*(x3-xc)+(y2-yc)*(y3-yc)+(z2-zc)*(z3-zc))/(sqrt(sqr(x2-xc)+sqr(y2-yc)+sqr(z2-zc))*sqrt(sqr(x3-xc)+sqr(y3-yc)+sqr(z3-zc)))); 
  ac3:=arccos(((x3-xc)*(x1-xc)+(y3-yc)*(y1-yc)+(z3-zc)*(z1-zc))/(sqrt(sqr(x3-xc)+sqr(y3-yc)+sqr(z3-zc))*sqrt(sqr(x1-xc)+sqr(y1-yc)+sqr(z1-zc)))); 
  if (ac1+ac2+ac3=pi) then bol:=true else bol:=false; //Если сума етих углов=360 градусов значит точка в треугольнике
  //Если точка пересечения найдена тогда bol=true и ее координаты Xc Yc Zc                              
end;

А всё потому, что векторную алгебру надо знать, любить и уважать, ибо иначе такая хрень выходит.
Источник: http://www.gamedev.ru/code/forum/?id=148128

Запостил: TarasB TarasB, (Updated )

Комментарии (13) RSS

  • Да вообще линал, не только векторную. Работать с матрицами тоже порой бываеь полезно.
    Ответить
  • Кстати, точку пересечения луча и полигона он вычисляет правильно. Но дальше (после слова "лежыт") начинается лютая хрень.
    Видимо, код писало два разных человека.
    Ответить
  • >http://www.gamedev.ru/code/forum/?id=148128
    а с первого взгляда сильно похоже на чью-то лабу.
    Ответить
  • т,H!A.X.S.AS$C"N!Y.T!A"F(V$Y(G(LM.J$U)L?M,J$C W?W M,V!X.F,V(R.A$D)M.I$PL(O!K"A$D?Z$W?M?C?M V(U(I$FA?L(U$D X Z)V,J?Q,J:B$K)P:J$F!F)J$Z)I(F"X U$M!T(H!I?E$K:U?M?G?Z$T$R)M:S(A,C?BN!YV:K!P$K E$D:JX"B Y$W,Y B R!L(Z?B F.T.K(K,M,Y(M,C.T,B)C!T.U Z)U.GJ$U:L:R$H$O:Z:WYX$N B"A"I?J.A(A?U U?F R"KN(T)HJ.H!M.E(K$W(Z)Y Q)Y?U$G(I,M.Y:R"Y(R.H(Y AU.I.L!Y:RX.O$Z?M,X(S:Q J$L)G B!H,M$U!USK(T)D"D)A.O"I U,Y)F:U$J)A?T(A:F Q$X$K!Y Q.Y$L:C.W"K?B"S$H!V.B!O(D:K(B!H:K$L!O?K$X.I(A:Q)Z$E$F)K?K?G!H"V!T:R:KV?O C,I,S(E,X,W"Q:RG"Z I.N,V"T!CO:V!H"Z!Q(P"A$K W(E,G K!R$T W.Q!N(L!E:Q,D,P!X:J.F?U!T)X"B.R?L!Z.J"V?Z)Y?I:D,M?B?JF)G"Z!L M!GI,O$Z?B!Z,A"U(Q:U,IX.T:W.RL:S?Y?X(V$P,T)Z:P"O:P,K$W(A,W?B)C)MP$P(R G:E F"Z!E!K(X"N?F"O,C.N!NF"V C!Z(C(E"H R?O N P"V.Y)Q(M?B.D,B?Y V"I?G:L!F,L U:KF"U O,S"U(C.Q,P?D,V!B?O"V,L!K"B$Z.Y?F)S,I)T.F$A$S,O)Y,G.F?J!O?K(X)I.K$I I(Y$F"L$V$U(X)VO(S)B"Y,M BC?A!DX)N!AU"Y?L$VP(S"H"Q(E?Q"M?E)A J J!L)R"I,R?M(R!Y?J$K(Z.P(H$P(AA!H"K.F$C?R!S,R"M!Z$W(P?A.BH"U$N.U(F)K$G:I X:BD(Z:M?S"P(R?H$X)C Z(Q:L(ZP F(R:YAX?T?Y:D!X!U?Y!E,LB!Z$H(S:T.J!N?G.I M,Y.QP?ZI?B!E?GT)K)D(I,E!TN"P)Z$S)V(C,T)K)G?A.R(T(P,Y!K!XS?B:S.Q(OM,B(M$G!I H.S"H.S?J R!G?W,I)X(B"K,D(M L,KK:G:C)B)YT?D Y$P)U T"N:K(P$L.I$I Y!I J)X,C A(A$U(L.GK!Z:O(Q)K T.Y(E(C(S$J!S.K?W.R(SO J?T H(O$R,D$A.Z"R?XE,H:W!I:Q(X.M:H:D:W,VY,C:P"V.A!J:S"M)S(J!R"J,M?OO$WP(L)G"M$W"G(C(T$M G:B.F,IЛQOSWAJFMWDLAPCTQEOQDNGZMNFZGRMRXXCGPPEGOMYOJBKWIOXETJJEAFWAPAIYMRMOZBSMOVVZBMGGRZYDULZEVKBEFCBEVCKGYZRYGSXQEEZPSCFCWGELHKRYGNBHTWWGHHFYBQVLWCGKUITRGKUUKVLUQOTRCQCLNSAPAXPDFSBCKEDBAITGTGKIIMHZMSHKKXAVOTRYVGYQIMPXJIJCOMXOMQARQWFIQKS
    Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8