Forum > Graphics

Handle 3D Coordinates on a canvas

(1/1)

Weitentaaal:
Hello,

so I wrote a program that can build some structures with blocks. However, I have certain problems with the return of 3D coordinates when clicking on the canvas. My predecessor who worked on this project had written a function which should calculate this. But the return values are not always correct. Could someone help me here on the hint. In the attachment is a picture. the depth level is steered with the arrows on the right side, whereby on the arrows must be clicked.

So i don't realy know how i get the correct X, Y Values out of the Canvas, because the Cubes are stretched. Also i do have my difficulties to handle resizing of the whole Building Area.

Here my current Code:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---   m3D.X:= -1;   m3D.Y:= -1;   m3D.Z:= -1;   If (MbDownOnDrw) and (Assigned(NewCube) Then Begin      LastX:= MoveHist[NMoves].X;      LastY:= MoveHist[NMoves].Y;      If (LastX = 0) and (LastY = 0) Then         Exit;      // Richtung der Maus bestimmen      If (LastX > 0) And (LastY > 0) Then Begin         // Winkel der letzten Mausbewegung bestimmen         If Abs(ActuX - LastX) = 0 Then begin            Angle:= 90;         end         else begin            Angle:= arctan(Abs(ActuY - LastY) / Abs(ActuX - LastX)) * (180 / 3.141592); //Bogenmaß -> grad         End;          If ActuX - LastX >= 0 Then begin // Bewegung nach rechts            XRicht:= 1;         end         else begin  // Bewegung nach Links            XRicht:= -1;         end;         If ActuY - LastY <= 0 Then Begin // Bewegung nach oben            YRicht:= 1;         end         else begin            YRicht:= -1;         end;          If (XRicht = 1) and (YRicht = 1) Then begin // Winkel in Segment 1 (0h bis 3h)übernehmen            Angle:= Angle;         end         else if (XRicht = -1) and (YRicht = 1) then begin // Winkel in Segment 2 (9h bis 12h)            Angle:= 90 + (90 - Angle);         end         else if (XRicht = -1) and (YRicht = -1) then begin // Winkel in Segment 3 (6h bis 9h)            Angle:= 180 + Angle;         end         else if (XRicht = 1) and (YRicht = -1) then begin            Angle:= 270 + (90 - Angle);         end;         // Bereiche aufteilen in primär zu ändernde Achse         MausRicht:= '';         If ((Angle >= 0) And (Angle < 20)) Or ((Angle >= 340) and (Angle <= 360)) Or ((Angle >=110) and (Angle < 200)) Then begin            MausRicht:= 'X';         end         else if ((Angle >= 20) and (Angle <= 70)) Or ((Angle >= 200) and (Angle < 250)) Then begin            MausRicht:= 'Y';         end         else if ((Angle > 70) and (Angle < 110)) Or ((Angle >= 250) And (Angle < 340)) Then begin            MausRicht:= 'Z';         end;         If Mausricht = '' Then            ShowMessage('Mausrichtungswinkel kontrollieren!');      End;       CDrw:= CoordRef(ActuX, ActuY, False);      cX:= CDrw.X;      cY:= CDrw.Y;      // auf Werkzeugfläche?      If (CDrw.X > ConstArea.X) and not IsMouseOnRubbish Then         Exit;       If LastWkzPos.X = -1 Then begin         // erste Position im Konstruktionsfeld         // X berechnen, wobei Y im ersten Schritt in der Mitte bei -3 liegt         If BahnYFix = -1 Then            AcY:= 2         else            AcY:= BahnYFix - 1;          AcX:= cX + AcY / 2;         AcZ:= cY + AcY / 2;      end      else begin         LastcY:= LastWkzPos.Z - LastWkzPos.Y / 2;         DeltaCy:= cY - LastcY;         Ok3DCoord:= True;          If BahnYFix = -1 Then Begin            repeat               If MausRicht = 'Y' Then begin                  // Änderung zur neuen cY Position primär auf Y anwenden                  If DeltaCy > 0 Then                     AcY:= LastWkzPos.Y - Abs(DeltaCy) * 2                  else                  AcY:= LastWkzPos.Y + Abs(DeltaCy) * 2;                   AcZ:= LastWkzPos.Z;                   If (AcY < 0) or (AcY > ConstArea.Y - CubeSize) Then begin                     MausRicht:= 'Z';                  end;               end;               If MausRicht = 'Z' Then begin                  // Änderung zur neuen cY Position primär auf Z anwenden                  If DeltaCy > 0 Then                     AcZ:= LastWkzPos.Z + Abs(DeltaCy)                  else                     AcZ:= LastWkzPos.Z - Abs(DeltaCy);                   AcY:= LastWkzPos.Y;                   If MausRicht = 'X' Then begin                     // Änderung an neuer cY Position auf Y und Z aufteilen                     If DeltaCy > 0 Then begin                        AcZ:= LastWkzPos.Z + Abs(DeltaCy) / 3;                        AcY:= LastWkzPos.Y - Abs(DeltaCy) / 3 * 2;                     end                     else begin                        AcZ:= LastWkzPos.Z - Abs(DeltaCy) / 3;                        AcY:= LastWkzPos.Y + Abs(DeltaCy) / 3 * 2;                     end;                     Ok3DCoord:= True;                  end;                end;               AcX:= cX + AcY / 2;            until Ok3DCoord;         end         else begin            AcY:= BahnYFix - 1;            AcZ:= cY + AcY / 2;            AcX:= cX + AcY / 2;         end;      End;      LastWkzPos.X:= AcX;      LastWkzPos.Y:= AcY;      LastWkzPos.Z:= AcZ;      // Aus AcX, AcY und AcZ TcX und TcY berechnen      If BahnYFix <> -1 Then begin         TcX:= AcX - AcY / 2;         If TcX <> cX Then            AcX:= cX + AcY / 2;         TcY:= AcZ - AcY / 2;         If Int(TcY * 10000) <> Int(cY * 10000) Then begin            // Y behalten und Z neu ausrechnen            AcZ:= cY + AcY / 2;         end;      End;      // Aktuelle 3D Position des Würfels merken      m3D.X:= trunc(AcX);      m3D.Y:= trunc(AcY);      m3D.Z:= trunc(AcZ);   End;

pixel_:
Hi. You can create one more TImage, make it not visible, paint every cell to different color r,g,b, create one or few arrays where this colors will saved, and then, when will click, by mouse x,y you can get color from invisible TImage, then find this color in array, index of color in array will equal index of cell.