Heim >Web-Frontend >PS-Tutorial >Bei der Knotenkurve kann die Maus den Knoten ziehen, um die Kurve anzupassen, ähnlich wie in Photoshop

Bei der Knotenkurve kann die Maus den Knoten ziehen, um die Kurve anzupassen, ähnlich wie in Photoshop

高洛峰
高洛峰Original
2017-02-20 09:50:013282Durchsuche

Eine der am häufigsten verwendeten Funktionen in Photoshop ist die Kurvenanpassung, wie in der Abbildung gezeigt.

Bei der Knotenkurve kann die Maus den Knoten ziehen, um die Kurve anzupassen, ähnlich wie in Photoshop

Fügen Sie Kurvenknoten hinzu, löschen Sie sie und ziehen Sie sie mit der Maus, um das Bild anzupassen Parameter. Von der Idee her (hier wird nur die Kurve selbst betrachtet, die Datenspeicherung ist in dieser Liste nicht enthalten) ist diese Funktion relativ einfach:

  1. Die Kurve wird durch eine Menge von dargestellt Punktknoten

  2. Das Bewegen des Knotens mit der Maus ändert tatsächlich einen einzelnen Punkt

  3. Punkt einfügen und löschen

  4. Ein Knoten ist ein Griff, es ist nur ein kleines Quadrat

  5. Zeichnen Sie eine Kurve, die durch alle Knoten in Paint DrawCurve verläuft

  6. Zeichnen ein Fadenkreuz zur Darstellung des aktuellen Knotens

  7. Bestimmen Sie beim Drücken der Maus, ob er sich in einem vorhandenen Knoten befindet. Wenn ja, markieren Sie ihn, andernfalls fügen Sie einen neuen Knoten hinzu

  8. Die Maus wird gedrückt und verschoben. Wenn ein Knoten vorhanden ist, sind die Knotenkoordinaten die Mauskoordinaten

  9. Zeichnung aktualisieren

Abgeschlossene Demonstration der Programmbedienung (Animation):

Bei der Knotenkurve kann die Maus den Knoten ziehen, um die Kurve anzupassen, ähnlich wie in Photoshop

Das Folgende ist Teil des Beispielcodes:

Knoten:


 List<point> points;</point>


Knotengriffe zeichnen:

Rectangle getHandle(Point p)
{
    Rectangle rect = new Rectangle(
        p.X - 3,
        p.Y - 3,
        6,
        6);
    return rect;
}
判断某点是否位于手柄区域:
bool isHandle(Point p)
{
    foreach (Point pt in points)
    {
        if (isInside(p, getHandle(pt)))
        {
            downIndex = points.IndexOf(pt);
            downPoint = pt;
            current = pt;
            return true;
        }
    }
    return false;
}
注意这个部分可以适当放大一下判断区域,这样便于鼠标操作(手柄太小,不易点击)。

Griffe zeichnen:

void drawHandle(Graphics g, Point p)
{
    if (points.IndexOf(p) == downIndex)
        g.FillRectangle(
            Brushes.Black,
            getHandle(p));
    else
        g.DrawRectangle(
            Pens.Black,
            getHandle(p));
}

Kurven zeichnen:

 void drawCurve(Graphics g)
 {
     g.DrawCurve(Pens.Black, points.ToArray());
 }

Kurven zeichnen verwendet die Kardinal-Spline-Zeichnungsmethode der Graphics-Klasse mit der Standardspannung von 0,5.

Kreuzpositionierungslinie zeichnen (Hilfsfunktion):

void drawCrosshair(Graphics g, Point p)
{
    g.DrawLine(
        Pens.Gray,
        0, p.Y,
        clientRect.Width,
        p.Y);
    g.DrawLine(
        Pens.Gray,
        p.X,
        0,
        p.X,
        clientRect.Height);
}

Mausziehen:

protected override void OnMouseMove(MouseEventArgs e)
{
    mousePoint = e.Location;
    if (mouseDown)
    {
        if (Current != null)
        {
            Current = mousePoint;
        }
        Refresh();
    }
}

Mehr Kurven mit Knoten, die Maus kann die Knoten ziehen, um sie anzupassen Kurve, bitte beachten Sie die chinesische PHP-Website für ähnliche Artikel zum Thema Photoshop!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn