يونغ (جافا الرسم البياني):كيفية منع تداخل تسميات Vertex وEdge؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

أنا أستخدم حاليا جونغ لرسم الرسوم البيانية (أعني حقًا الرسوم البيانية وليس الرسوم البيانية!).المشكلة هي أن تسميات Vertex وEdge تتداخل مع الرؤوس والحواف.وهذا يؤدي إلى رسوم بيانية غريبة المظهر.المشكلة ليست مرتبطة بخوارزمية تخطيط محددة (على الرغم من أنني كنت أستخدم FRLayout).

هل هناك أي احتمالات لإخبار JUNG بمنع هذه التداخلات؟كنت آمل أن يتم تنفيذ ذلك بالفعل وأن المشكلة الوحيدة هي العثور على الخيارات الصحيحة!

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

المحلول

(الإجابة التالية تفترض Jung2؛لست على دراية بما قبل Jung2).

إحدى نقاط قوة يونغ هي أنها قابلة للتوسيع للغاية، ويمكن تمديدها بسهولة.يسمح لك Jung بتوصيل محولات مختلفة (خصائص تجسيد بسيطة)، وعارضين (عرض أكثر تعقيدًا)، وما إلى ذلك، لتخصيص السلوك عندما لا يكون الإعداد الافتراضي صحيحًا تمامًا.يتم تثبيتها عادةً على RenderContext (والتي يمكنك الحصول عليها من VisualizationViewer الخاص بك).

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

على سبيل المثال، يمكن تخصيص عرض تسمية قمة الرأس عن طريق توصيل عارض تسمية قمة جديد (واجهة Renderer.VertexLabel).على سبيل المثال، يمكنك إنشاء مثيل لـ BasicVertexLabelRenderer وتحديد موقع مختلف (شمال، غرب، وسط، وما إلى ذلك).يمكنك وضع الملصق الخاص بك في المركز، إذا كنت على استعداد لتغيير الشكل إلى شيء أكبر من تلك الدائرة (للقيام بذلك، قم بتثبيت محول الشكل الرأسي الخاص بك - مثال على المحول).وبدلاً من ذلك، يمكنك إنشاء تطبيقك المخصص لهذه الواجهة والذي يعرض خلفية أسفل نص التسمية.

يمكنك أيضًا تثبيت الإصدار المعدل الخاص بك من Renderer.EdgeLabel (راجع BasicEdgeLabelRenderer الخاص بـ Jung) لتخصيص موضع تسمية الحافة.

نصائح أخرى

تحتاج فقط إلى تعيين إزاحة التسمية:

vv.getRenderContext().setLabelOffset(20);

أين ت هو الخاص بك VisualizationViewer هدف.

وبالمناسبة، إذا كنت لا تريد تغيير اللون، في البداية يبدو أن يكون الألم كبيرا. لكنني اكتشفت مؤخرا هذا قليل الحيلة:

Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{
            new ToStringLabeller<String>(),
            new Transformer<String,String>() {
            public String transform(String input) {
                return "<html><font color=\"yellow\">"+input;
            }}});

context.setVertexLabelTransformer(labelTransformer);

وأعتقد أن هذا هو فقط كيف تنفذ لها، والكتاب من رمز ربما لا يراها قضية. المكتبة JUNG هو مفتوح المصدر بحيث انكم مدعوون الى إجراء تغييرات عليه النحو الذي تراه مناسبا.

إذا كنت لا ترغب في تغيير رمز حل سهل لجعل سوف التسميات أكثر قابلية للقراءة يكون لمجرد تغيير لون التسميات، حتى أنها تختلف عن الحواف.

ولقد واجهت نفس المشكلة من تسميات حافة تتداخل. حل سريع وقذرة اعتدت على وضع التسميات حافة هو من الحشو مدة معينة مع المساحات البيضاء في قيمة السلسلة.

//pad some white spaces to value of edge when adding edges to the graph
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2);

ووسوف تجنب التسميات حافة من يخيم وتتداخل في وسط وخصوصا عند بناء رسم بياني ثنائي. آمل أن يساعد هذا بعض من كنت هناك!

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