Új hozzászólás Aktív témák

  • Jester01

    veterán

    válasz Tottu #1202 üzenetére

    Simán a fekete szakasz szögét kiszámolod majd ez alapján a piros vektorokat legyártod elforgatással és szépen hozzáadod a kívánt végponthoz.
    Kb így:
    adott: P0(x0, y0), P1(x1, y1), r és alfa
    szakasz szöge beta = atan2(y1 -y0, x1 - x0)
    nyíl szögek gamma0 = beta + alfa, gamma1 = beta - alfa
    elforgatott hegy Q0(x2, y2) = (r * cos(gamma0), r * sin(gamma0))
    Q1(x3, y3) = (r * cos(gamma1, r * sin(gamma1))
    eltolt nyílhegyek végpontja:
    R0 = P1 - Q0 = (x1 - x2, y1 - y2)
    R1 = P1 - Q1 = (x1 - x3, y1 - y3)

    Kész. Annyi trükk van benne, hogy beta számolásnál figyelni kell a helyes koordináta negyedre (ezért használtam atan2-t) illetve a piros szakaszok helyett azok ellentettjét könnyebb számolni ezért a kivonás a végén.
    Itt egy példakód C#-ban:

    private Gdk.Point GetHalfArrow(Gdk.Point P1, double gamma, int r)
    {
    Gdk.Point Q = new Gdk.Point((int)(r * Math.Cos(gamma)), (int)(r * Math.Sin(gamma)));
    Gdk.Point R = new Gdk.Point(P1.X - Q.X, P1.Y - Q.Y);
    return R;
    }

    private void DrawArrow(Gdk.Point P0, Gdk.Point P1, int r, double alpha)
    {
    double beta = Math.Atan2(P1.Y - P0.Y, P1.X - P0.X);
    Gdk.Point R0 = GetHalfArrow(P1, beta + alpha, r);
    Gdk.Point R1 = GetHalfArrow(P1, beta - alpha, r);

    // draw 3 lines: P0-P1 for body, P1-R0 and P1-R1 for the head
    }

    Jester

Új hozzászólás Aktív témák