Einzelnen Beitrag anzeigen

Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

Ein bisschen lineare Algebra

  Alt 1. Mär 2010, 12:10
Also, eigentlich dürfte das kein Problem sein - habe ich mir gedacht...

Ich wollte mir einen Farb-Ring bauen; später will ich daraus auch ein Control machen. Was das Teil genau können soll, müsst ihr noch nicht wissen, denn es hakt schon deutlich vorher.

Ich will die Farbe jedes Pixels über den Winkel errechnen, und wenn ich den kennen würde, wäre das ganze auch kein Problem. Folgendermaßen gehe ich bis jetzt vor:

1. Ich zeichne einen schwarzen Ring auf weißem Grund. (Canvas.Ellipse, temporäres BMP)
2. Ich durchlaufe die einzelnen Pixel vom Bild (im Moment noch über Canvas.Pixels, aber das werde ich noch rausoptimieren) und schreibe auf das Zielcanvas (das von der Form) den berechneten Farbwert, sofern ich kein weißes Pixel habe.

Den Farbwert will ich berechnen, indem ich den Winkel "alpha" verarbeite (siehe angefügte Skizze).
Natürlich sind N, Z und M bekannt.

Meine Überlegung ist nun so:
Code:
N(aRadius, 0).
M(aRadius, aRadius).
Z(x, y).
n = N - M = (0, -aRadius).
z = Z - M = (x - aRadius, y - aRadius).
alpha = arccos( (n * z) / (|n| * |z|) ).
wobei n * z für das Skalarprodukt und |n| für den Betrag/die Länge steht.

In Quellcode habe ich das ganze nun so versucht umzusetzen:
Delphi-Quellcode:
function ScalarProduct(var pVec1, pVec2:TPoint):integer;
begin
Result:=(pVec1.X * pVec2.X) + (pVec1.Y * pVec2.Y);
end;

function Length(var pVec:TPoint):Extended;
begin
Result:=Sqrt(Sqr(pVec.X)+Sqr(pVec.Y));
end;
{...}
function TColorRing.getColor(X, Y: integer): TColor;
var
  vecN,
  vecZ:TPoint;
  Angle:Extended;
begin
vecN:=Point(0, -aRadius);
vecZ:=Point(X-aRadius, Y-aRadius);
Angle:=ScalarProduct(vecN, vecZ)/(Length(vecN)*Length(vecZ));
Angle:=ArcCos(Angle);
Result:=trunc(Angle*(360/Pi)); // Sollte Werte zwischen 0 und 360 geben.
end;
Aber leider scheint das ganze nicht so funktionieren zu wollen, wie ich das gern hätte, denn Result liegt zwar richtigerweise zwischen 0 und 360, aber die Werte sind "gespiegelt", also der rechte Halbkreis liefert 0..360 genau wie der Linke. Ich hätte aber gern oben die 0/360, rechts die 90, unten die 180 und links die 270; der Rest entsprechend dazwischen...

Wer kann mir helfen, meinen Fehler zu finden?

Gruß,
Euer LDer
Angehängte Grafiken
Dateityp: bmp skizze_183.bmp (403,3 KB, 17x aufgerufen)
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat