AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OpenGL glViewPort

Ein Thema von DaCoda · begonnen am 3. Okt 2024 · letzter Beitrag vom 4. Okt 2024
 
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
165 Beiträge
 
Delphi 12 Athens
 
#7

AW: OpenGL glViewPort

  Alt 4. Okt 2024, 17:18
@IceBube:

Jo, das war genau der Gedankenansatz. Manchmal ist es so einfach, wenn man dann die Idee hat

Nun muss ich nur noch schauen, wie ich die Meine "ARC-Funktion" nachbauen kann, da es Arc ja scheinbar so nicht gibt.

Code:
procedure TGCodeRenderer.DrawArc(CX, CY, Radius, StartAngle, EndAngle: Double; Clockwise: Boolean; Color: TColor);
var
  StartX, StartY, EndX, EndY: Double;
  ArcRect: TRect;
begin
  StartX := CX + Radius * Cos(StartAngle);
  StartY := CY + Radius * Sin(StartAngle);
  EndX := CX + Radius * Cos(EndAngle);
  EndY := CY + Radius * Sin(EndAngle);

  if (Round(StartX * FScale) = Round(EndX * FScale)) and (Round(StartY * FScale) = Round(EndY * FScale)) then begin
    FCurrentX := EndX;
    FCurrentY := EndY;
    Exit;
  end;

  ArcRect := Rect(
    Round((CX - Radius) * FScale),
    Round((CY - Radius) * FScale),
    Round((CX + Radius) * FScale),
    Round((CY + Radius) * FScale)
    );
  ArcRect.NormalizeRect;

  FCanvas.Pen.Color := Color;
   if Clockwise then begin
     FCanvas.Arc(ArcRect.Left, Round(AdjustY(ArcRect.Top)), Round(ArcRect.Right), Round(AdjustY(ArcRect.Bottom)), Round(EndX * FScale), Round(AdjustY(EndY * FScale)), Round(StartX * FScale), Round(AdjustY(StartY * FScale)));
  end else begin
     FCanvas.Arc(ArcRect.Left, Round(AdjustY(ArcRect.Top)), Round(ArcRect.Right), Round(AdjustY(ArcRect.Bottom)), Round(StartX * FScale), Round(AdjustY(StartY * FScale)), Round(EndX * FScale), Round(AdjustY(EndY * FScale)));
  end;

  FCurrentX := EndX;
  FCurrentY := EndY;
end;
Wobei man das Runden und Scale ja nicht mehr braucht dann.

Ich hab das so versucht:

Code:
procedure TGCodeRenderer.DrawArc(CX, CY, CZ, Radius, StartAngle, EndAngle: Double; Clockwise: Boolean; Color: TColor);
const
  Segments = 100; // Anzahl der Segmente für den Bogen
var
  Step, Angle, NextAngle: Double;
  i: Integer;
  X1, Y1, Z1, X2, Y2, Z2: Double;
begin
  // Setze die Farbe (abhängig vom verwendeten OpenGL-Setup)
  glColor3f(GetRValue(Color) / 255.0, GetGValue(Color) / 255.0, GetBValue(Color) / 255.0);

  // Berechne die Winkel-Differenz für die Richtung
  if Clockwise then
  begin
    if EndAngle > StartAngle then
      EndAngle := EndAngle - 360;
    Step := (StartAngle - EndAngle) / Segments;
  end
  else
  begin
    if EndAngle < StartAngle then
      EndAngle := EndAngle + 360;
    Step := (EndAngle - StartAngle) / Segments;
  end;

  // Zeichnen des Bogens im 3D-Raum mit GL_LINES
  glBegin(GL_LINES);
  for i := 0 to Segments - 1 do
  begin
    // Berechne den aktuellen Winkel und den nächsten Winkel für die Linie
    Angle := StartAngle + i * Step;
    NextAngle := StartAngle + (i + 1) * Step;

    // Aktuellen Punkt (X1, Y1, Z1) berechnen
    X1 := CX + Radius * Cos(DegToRad(Angle));
    Y1 := CY + Radius * Sin(DegToRad(Angle));
    Z1 := CZ;

    // Nächsten Punkt (X2, Y2, Z2) berechnen
    X2 := CX + Radius * Cos(DegToRad(NextAngle));
    Y2 := CY + Radius * Sin(DegToRad(NextAngle));
    Z2 := CZ;

    // Linie zeichnen zwischen den Punkten (X1, Y1, Z1) und (X2, Y2, Z2)
    glVertex3f(X1, Y1, Z1);
    glVertex3f(X2, Y2, Z2);
  end;
  glEnd;

  FCurrentX := X2;
  FCurrentY := Y2;
  FCurrentZ := Z2;

end;

Vielen Dank!
Debuggers don’t remove bugs, they only show them in slow-motion.

Geändert von DaCoda ( 4. Okt 2024 um 17:34 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz