ربط اثنين من عناصر قماش WPF بواسطة خط، من دون استخدام المراسي؟

StackOverflow https://stackoverflow.com/questions/1737509

سؤال

ولدي قماش لالمخططات، ونريد للانضمام العقد في مخطط بخطوط موجهة (السهم ينتهي). حاولت النهج مرساة، حيث خطوط إرفاق فقط في نقاط محددة على العقد ولكن ذلك لم ينجح بالنسبة لي، بدا الأمر وكأنه حماقة.

وأنا ببساطة تريد خط من وسط كل كائن إلى أخرى، ووقف على حافة خط العقد "من أجل نهاية السهم لإظهار بشكل صحيح. لكن العثور على حافة عنصر قماش لتقاطعات اختبار ضد أثبت صعوبة.

وأي أفكار؟

هل كانت مفيدة؟

المحلول

وحصلت على أسلوب العمل باستخدام المربع المحيط للعنصر. أنها ليست مثالية، لأن عناصر بلدي ليست مستطيلة تماما، ولكن يبدو OK.

وأساسا أجد مربع إحاطة من عنصر في إحداثيات قماش من قبل:

    private static Rect GetBounds(FrameworkElement element, UIElement visual)
    {
        return new Rect(
            element.TranslatePoint(new Point(0, 0), visual),
            element.TranslatePoint(new Point(element.ActualWidth, element.ActualHeight), visual));
    }

وبعد ذلك أجد تقاطع خط الوسط إلى مركز ضد كل من الجوانب الأربعة للمربع المحيط، واستخدام ذلك نقطة تقاطع لربط عنصرين من شكل الخط.

ولقد وجدت رمز التقاطع في الطرف الثالث النينجا: http://thirdpartyninjas.com/blog/2008/10/07 / خط شريحة تقاطع /

private void ProcessIntersection()
    {
        float ua = (point4.X - point3.X) * (point1.Y - point3.Y) - (point4.Y - point3.Y) * (point1.X - point3.X);
        float ub = (point2.X - point1.X) * (point1.Y - point3.Y) - (point2.Y - point1.Y) * (point1.X - point3.X);
        float denominator = (point4.Y - point3.Y) * (point2.X - point1.X) - (point4.X - point3.X) * (point2.Y - point1.Y);

        intersection = coincident = false;

        if (Math.Abs(denominator) <= 0.00001f)
        {
            if (Math.Abs(ua) <= 0.00001f && Math.Abs(ub) <= 0.00001f)
            {
                intersection = coincident = true;
                intersectionPoint = (point1 + point2) / 2;
            }
        }
        else
        {
            ua /= denominator;
            ub /= denominator;

            if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1)
            {
                intersection = true;
                intersectionPoint.X = point1.X + ua * (point2.X - point1.X);
                intersectionPoint.Y = point1.Y + ua * (point2.Y - point1.Y);
            }
        }
    }

وفويلا! يتم رسم خطوط الآن كما لو أنها تذهب من وسط كل عقدة إلى أخرى، ولكن توقف تقريبا على حافة العقدة حتى نهاية السهم مرئيا.

وهناك تحسن هذه الطريقة سيكون لاختبار ضد حافة الفعلية للعقدة نفسها، مثل العقد بيضاوي الشكل، ولكن ليس لدي حتى الآن لإيجاد طريقة WPF التي توفر لي مع الهندسة أو مسار أستطيع أن اختبار مقابل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top