2010-06-09 11 views
13

पर तीर खींचें क्या किसी के पास किसी दिए गए रेखा के बीच में तीर खींचने के लिए एल्गोरिदम है। मैंने Google की खोज की है लेकिन मुझे कोई अच्छा कार्यान्वयन नहीं मिला है।लाइन एल्गोरिदम

पीएस मुझे वास्तव में भाषा नहीं है, लेकिन यह जावा होगा अगर यह बहुत अच्छा होगा, क्योंकि यह वह भाषा है जिसका मैं उपयोग कर रहा हूं।

अग्रिम धन्यवाद।

+0

क्या यह एक तीर रेखा के बीच में इंगित करता है? या इससे आ रहा है? या एक तीरहेड जो लाइन के साथ चलता है? –

+0

जो लाइन के साथ चलता है। – nunos

उत्तर

20

यहां एक बिंदु पर अपने सिर के साथ तीर खींचने के लिए एक फ़ंक्शन है। आप इसे अपनी लाइन के मध्य बिंदु पर सेट करेंगे। डीएक्स और डीई रेखा दिशा हैं, जो (x1 - x0, y1 - y0) द्वारा दी गई है। यह एक तीर देगा जो रेखा की लंबाई तक बढ़ाया जाता है। यदि आप तीर हमेशा एक ही आकार के लिए चाहते हैं तो इस दिशा को सामान्य करें।

private static void DrawArrow(Graphics g, Pen pen, Point p, float dx, float dy) 
{ 
    const double cos = 0.866; 
    const double sin = 0.500; 
    PointF end1 = new PointF(
     (float)(p.X + (dx * cos + dy * -sin)), 
     (float)(p.Y + (dx * sin + dy * cos))); 
    PointF end2 = new PointF(
     (float)(p.X + (dx * cos + dy * sin)), 
     (float)(p.Y + (dx * -sin + dy * cos))); 
    g.DrawLine(pen, p, end1); 
    g.DrawLine(pen, p, end2); 
} 
+2

एक तीरहेड के आकार को कैसे समायोजित करेगा? मुझे यह लाइन की लंबाई के आधार पर पसंद है, लेकिन मेरे आवेदन के लिए तीरहेड आकार से लाइन आकार का वर्तमान अनुपात गलत है। – renosis

11

यहां एक तीर सिर को एक पंक्ति में जोड़ने का तरीका है। आपको बस इसे अपने तीर टिप और पूंछ के निर्देशांक देना होगा।

private static void drawArrow(int tipX, int tailX, int tipY, int tailY, Graphics2D g) 
{ 
    int arrowLength = 7; //can be adjusted 
    int dx = tipX - tailX; 
    int dy = tipY - tailY; 

    double theta = Math.atan2(dy, dx); 

    double rad = Math.toRadians(35); //35 angle, can be adjusted 
    double x = tipX - arrowLength * Math.cos(theta + rad); 
    double y = tipY - arrowLength * Math.sin(theta + rad); 

    double phi2 = Math.toRadians(-35);//-35 angle, can be adjusted 
    double x2 = tipX - arrowLength * Math.cos(theta + phi2); 
    double y2 = tipY - arrowLength * Math.sin(theta + phi2); 

    int[] arrowYs = new int[3]; 
    arrowYs[0] = tipY; 
    arrowYs[1] = (int) y; 
    arrowYs[2] = (int) y2; 

    int[] arrowXs = new int[3]; 
    arrowXs[0] = tipX; 
    arrowXs[1] = (int) x; 
    arrowXs[2] = (int) x2; 

    g.fillPolygon(arrowXs, arrowYs, 3); 
} 
+0

आपको बहुत बहुत धन्यवाद ... आपने अपना बहुत समय बचाया ... –

संबंधित मुद्दे