Laden...

[gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?

Erstellt von Birne vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.076 Views
B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren
[gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?

Hallo Allerseits.
Ich habe ein Problem mit der Abfrage ob sich die Maus ain einer Region, bzw. auf einer Geomtetrischen Figur befindet.

Bisher frage ich wie folgt ab:

        private void MapControlRectangle_MouseDown(object sender, MouseEventArgs e)
        {
            if (_borderRegionPath.IsVisible(new Point(e.Y, e.X)))
            {
                _readyForAction = true;
                this.Region = new Region(_borderRegionPath);
            }
            _startPosition = this.PointToScreen(e.Location);
            _startLocation = this.Location;
        }

Drehe ich nun aber die Figur mittels einer Matrix, so ist es schier unmöglich noch einmal die BorderRegion zu treffen.

Nach diversen klicken in und um(!) die eigentliche region schafft man es dann aber irgendwann einmal. Allerdings sehr unzufriedenstellend.

Weiss jemand Rat ?
Gruß und Danke schonmal 🙂
Birne

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

vermutlich fährst du besser, wenn du die Punkte, die den Path ausmachen, drehst (Matrix.TransformPoints), bevor du den Path erstellst.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Zunächst einmal danke für die Antwort.
Leider führt dieses nicht zum Erfolg, mag aber auch an meiner Ausführung liegen :\
Newbe ...
(Was nicht heissen soll dass ich mir noch keine lehrende Lektüre zu Gemüte geführt habe !)

            
mx.RotateAt(_angel, new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2), MatrixOrder.Append);
// mx ist die Matrix
Point ptPosition = new Point();
            ptPosition.X = x;
            ptPosition.Y = y;

            Point ptSize = new Point();
            ptSize.X = width;
            ptSize.Y = height;

            Point[] array = new Point[] { ptPosition, ptSize };
            mx.TransformPoints(array);
// Oben
            _graphicsPath.AddLine(x + cornerRadius, y, x + width - cornerRadius, y);
            _regionPath.AddLine(x + cornerRadius - border, y - border, x + width - cornerRadius + border, y - border);
            _borderRegionPath.AddLine(x + cornerRadius + halfBorderArea, y + halfBorderArea, x + width - cornerRadius - halfBorderArea, y + halfBorderArea);
            // Ecke rechts oben
            _graphicsPath.AddArc(x + width - cornerRadius, y, cornerRadius, cornerRadius, 270, 90);
            _regionPath.AddArc(x + width - cornerRadius + border, y - border, cornerRadius, cornerRadius, 270, 90);
            _borderRegionPath.AddArc(x + width - cornerRadius - halfBorderArea, y + halfBorderArea, cornerRadius, cornerRadius, 270, 90);


usw. usf.
Schlussendlich dann:

            // Die Figur abschließen
            _graphicsPath.CloseFigure();
            _regionPath.CloseFigure();
            _borderRegionPath.CloseFigure();
            _graphicsPath.Transform(mx);
            _regionPath.Transform(mx);
            _borderRegionPath.Transform(mx);

meine Figur (viereck mit abgerundeten ecken) ist nun zwar etwas deformiert, doch reagiert noch immer nicht korrekt auf die Events.

Der Bereich auf Welchen reagiert wird, scheint nach dem Drehen der Figur, Derselbe zu sein, wie vor dem Drehen, also in einem winkelzustand von 0°.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

mein Vorschlag war, alle Punkte vor der Verwendung, also vor dem Hinzufügen zum Graphics.Path zu drehen.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Wenn ich vorher


            _graphicsPath.Transform(mx);
            _regionPath.Transform(mx);
            _borderRegionPath.Transform(mx);

aufrufe, so dreht sich das Objekt im Falle einer Winkeländerung nicht mehr.

Ansonsten werden alle benötigten Punkte welche ich in eine Array gepackt habe doch vorher gedreht oder nicht 🤔

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

nochmal: Du sollst nicht den GraphicsPath drehen, sondern vorher die Punkte, die du zu dessen Erstellung verwendest. Dabei hilft dir das schon genannte Matrix.TransformPoints.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Habe es nun dank deiner Hilfe mit einigem Gefrikkel hinbekommen =)

Danke für die Hilfe 👍
Thema kann geschlossen bzw als gelöst markiert werden.