2011-08-21 12 views
7

मैं समझने की कोशिश कर रहा हूं कि कैम्ब्रिजॉफ्ट द्वारा विकसित उद्योग-अग्रणी रसायन उपकरण केमड्रा, बेजियर वक्र का निर्माण कैसे करता है, ताकि मैं अन्य कार्यक्रमों से बेजियर वक्र बिंदुओं का मैन्युअल रूप से अनुवाद कर सकूं/केमड्रा के लिए पहचानने योग्य वक्र डेटा में रूटीन (जैसे घर से बना डेल्फी/सी # यूटिलिटीज)। शुरू करने से पहले, मुझे यह स्वीकार करना होगा कि मैं पूछ रहा हूं कि कुछ ब्लैकबॉक्स आंतरिक रूप से कैसे काम करता है, और इसलिए किसी भी परेशानी के लिए माफी मांगना और किसी भी मदद की सराहना करना चाहता हूं!विश्लेषण करने में सहायता करें कि सॉफ़्टवेयर/प्रोग्राम बेजियर वक्र का निर्माण कैसे करता है

मैंने चेमड्रा में चार प्रकार के सबसे सरल बेजियर घटता बनाये हैं और उन्हें .CDXML फ़ाइल के रूप में सहेजा है, जिसमें वक्र अनुभाग अंत में चिपकाया गया है। दोनों .CDXML फ़ाइलों और संबंधित चित्रों को फाइलर्व से डाउनलोड किया जा सकता है। Download Bezier_curve_ChemDraw_sample hereChemDraw trial edition can be downloaded here

प्रश्न

प्रश्न 1. उदाहरण के लिए "पंक्ति" प्रकार की वक्र अंक ले लो, वहाँ समग्र दो अंक है कि मैं प्रयोग किया जाता है जब इस वक्र बनाने हैं। ChemDraw इसके लिए छह अंक क्यों स्टोर करता है? और ChemDraw वास्तव में इन बिंदुओं की व्याख्या कैसे करता है? वही प्रश्न अन्य तीन प्रकारों के लिए मौजूद है, जो अधिकतम चार स्पष्ट बिंदुओं को नियोजित करते हैं।

प्रश्न 2. यदि चेमड्रा में "तीन बिंदुओं का उपयोग करके बेजियर वक्र" सामग्री की सामग्री प्रदर्शित होती है, तो कोई भी पहली बिंदु (12.22, 104.25) नहीं देख सकता है। मेरा मतलब है, इसका एक्स समन्वय स्पष्ट रूप से 12 से बड़ा है। यह क्यों हो रहा है? क्या ChemDraw डेटा के साथ कुछ परिवर्तन करता है? "प्रश्न चार बिंदुओं का उपयोग करके बेजियर वक्र" के लिए एक ही प्रश्न मौजूद है।

प्रश्न 3. ऐसा लगता है कि CurvePoints विशेषता के अंत में अतिरिक्त खाली चरित्र अंतर बनाता है। वास्तव में क्या अंतर है?

क्या कोई मुझे इन समस्याओं के बारे में बता सकता है?

ChemDraw .CDXML फाइलों में वक्र वर्गों

============ लाइन ==============
Line

<curve 
id="2" 
Z="1" 
ArrowheadType="Solid" 
CurvePoints="143.47 116.25 143.47 116.25 143.47 116.25 300.22 117.75 300.22 117.75 300.22 117.75" 
/> 

============ बेज़ियर वक्र तीन अंक का उपयोग कर - पहले प्रकार ==============
Curve - three points - drag the starting point

<curve 
id="2" 
Z="1" 
ArrowheadType="Solid" 
CurvePoints="12.22 104.25 121.72 106.5 231.22 108.75 230.47 204 230.47 204 230.47 204" 
/> 

============ बेज़ियर वक्र तीन अंक का उपयोग कर - दूसरे प्रकार ==============
Curve - three points - drag the stopping point

<curve 
id="2" 
Z="1" 
ArrowheadType="Solid" 
CurvePoints="134.47 97.5 134.47 97.5 134.47 97.5 231.22 60.75 229.72 109.5 228.22 158.25" 
/> 

===== ======= बेज़ियर वक्र चार अंक ============== का उपयोग कर
Curve - three points - drag both the starting and the stopping points

<curve 
id="2" 
Z="1" 
ArrowheadType="Solid" 
CurvePoints="5.47 93.75 123.22 93.75 240.97 93.75 351.22 177.75 236.47 177.75 121.72 177.75" 
/> 

उदाहरण सी # कार्यक्रम एक ही घटता उत्पन्न करने के लिए

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WinForms_2_DrawBezier 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Text = "Draw Bezier Curve"; 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      // DrawBezier_1(this, e); 
      // DrawBezier_2(this, e); 
      // DrawBezier_3(this, e); 
      DrawBezier_4(this, e); 
     } 

     private void DrawBezier_1(object sender, PaintEventArgs e) 
     { 
      Pen l_pen = new Pen(Color.Black); 
      PointF l_pt1 = new PointF(143.47f, 116.25f); 
      PointF l_pt2 = new PointF(l_pt1.X, l_pt1.Y); 
      PointF l_pt3 = new PointF(l_pt1.X, l_pt1.Y); 
      PointF l_pt4 = new PointF(300.22f, 117.75f); 
      PointF l_pt5 = new PointF(l_pt4.X, l_pt4.Y); 
      PointF l_pt6 = new PointF(l_pt4.X, l_pt4.Y); 

      PointF[] l_pts = new PointF[6]; 
      l_pts[0] = l_pt1; 
      l_pts[1] = l_pt2; 
      l_pts[2] = l_pt3; 
      l_pts[3] = l_pt4; 
      l_pts[4] = l_pt5; 
      l_pts[5] = l_pt6; 

      // e.Graphics.DrawBezier(l_pen, l_pt1, l_pt2, l_pt5, l_pt6); 

      e.Graphics.DrawBezier(l_pen, l_pt1, l_pt3, l_pt4, l_pt6); // As suggested by Dani 

      // e.Graphics.DrawBeziers(l_pen, l_pts); 
     } 

     private void DrawBezier_2(object sender, PaintEventArgs e) 
     { 
      Pen l_pen = new Pen(Color.Black); 
      PointF l_pt1 = new PointF(12.22f, 104.25f); 
      PointF l_pt2 = new PointF(121.72f, 106.5f); 
      PointF l_pt3 = new PointF(231.22f, 108.75f); 
      PointF l_pt4 = new PointF(230.47f, 204f); 
      PointF l_pt5 = new PointF(l_pt4.X, l_pt4.Y); 
      PointF l_pt6 = new PointF(l_pt4.X, l_pt4.Y); 

      PointF[] l_pts = new PointF[6]; 
      l_pts[0] = l_pt1; 
      l_pts[1] = l_pt2; 
      l_pts[2] = l_pt3; 
      l_pts[3] = l_pt4; 
      l_pts[4] = l_pt5; 
      l_pts[5] = l_pt6; 

      // e.Graphics.DrawBezier(l_pen, l_pt1, l_pt2, l_pt3, l_pt4); 

      e.Graphics.DrawBezier(l_pen, l_pt1, l_pt3, l_pt4, l_pt6); // As suggested by Dani 

      // e.Graphics.DrawBeziers(l_pen, l_pts); 
     } 

     private void DrawBezier_3(object sender, PaintEventArgs e) 
     { 
      Pen l_pen = new Pen(Color.Black); 
      PointF l_pt1 = new PointF(134.47f, 97.5f); 
      PointF l_pt2 = new PointF(l_pt1.X, l_pt1.Y); 
      PointF l_pt3 = new PointF(l_pt1.X, l_pt1.Y); 
      PointF l_pt4 = new PointF(231.22f, 60.75f); 
      PointF l_pt5 = new PointF(229.72f, 109.5f); 
      PointF l_pt6 = new PointF(228.22f, 158.25f); 

      PointF[] l_pts = new PointF[6]; 
      l_pts[0] = l_pt1; 
      l_pts[1] = l_pt2; 
      l_pts[2] = l_pt3; 
      l_pts[3] = l_pt4; 
      l_pts[4] = l_pt5; 
      l_pts[5] = l_pt6; 

      // e.Graphics.DrawBezier(l_pen, l_pt3, l_pt4, l_pt5, l_pt6); 

      e.Graphics.DrawBezier(l_pen, l_pt1, l_pt3, l_pt4, l_pt6); // As suggested by Dani 

      // e.Graphics.DrawBeziers(l_pen, l_pts); 
     } 

     private void DrawBezier_4(object sender, PaintEventArgs e) 
     { 
      Pen l_pen = new Pen(Color.Black); 
      PointF l_pt1 = new PointF(5.47f, 93.75f); 
      PointF l_pt2 = new PointF(123.22f, 93.75f); 
      PointF l_pt3 = new PointF(240.97f, 93.75f); 
      PointF l_pt4 = new PointF(351.22f, 177.75f); 
      PointF l_pt5 = new PointF(236.47f, 177.75f); 
      PointF l_pt6 = new PointF(121.72f, 177.75f); 

      PointF[] l_pts = new PointF[6]; 
      l_pts[0] = l_pt1; 
      l_pts[1] = l_pt2; 
      l_pts[2] = l_pt3; 
      l_pts[3] = l_pt4; 
      l_pts[4] = l_pt5; 
      l_pts[5] = l_pt6; 

      // e.Graphics.DrawBezier(l_pen, l_pt1, l_pt4, l_pt5, l_pt6); 

      e.Graphics.DrawBezier(l_pen, l_pt1, l_pt3, l_pt4, l_pt6); // As suggested by Dani 

      // e.Graphics.DrawBeziers(l_pen, l_pts); 
     } 
    } 
} 

हालांकि, मैं इस सी # उपयोगिता को पहले Line प्रकार को छोड़कर केमड्रा डिस्प्ले के समान वक्र उत्पन्न नहीं कर सकता।
C# DrawBezier_1 screen-capture
C# DrawBezier_2 screen-capture C# DrawBezier_3 screen-capture C# DrawBezier_4 screen-capture

+2

विस्तृत सवाल की वजह से upvoted। –

उत्तर

7

इसके मानक बेज़ियर वक्र एल्गोरिथ्म जो एक वक्र के निर्माण के लिए अंक की किसी भी राशि ले जा सकते हैं का उपयोग कर। Bézier curve

संपादित करें:
सी # DrawBezier केवल वर्गबद्ध (चार बिंदु) बेजियर का समर्थन करता है। आप चार बिंदु बेज़ियर सी # का उपयोग करने के अनुवाद किया जाएगा:

float[] CurvePoints = GetCurvePoints(); 

DrawBezier(Pen, CurvePoints[0], CurvePoints[1], CurvePoints[4], CurvePoints[5], 
       CurvePoints[6], CurvePoints[7], CurvePoints[10], CurvePoints[11]); 

कहाँ GetCurvePoints() केवल आपके CurvePoints XML विशेषता से अंक की सूची देता है।

संपादित करें 2:
कोड पिछले वक्र सभी घटता पुन: पेश करने:

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Linq; 
using System.Collections.Generic; 

public class Bezier : Form 
{ 
    static public void Main() 
    { 
     Application.Run (new Bezier()); 
    } 

    protected override void OnPaint (PaintEventArgs e) 
    { 
     // The input with all points 
     string CurveDataString = "5.47 93.75 123.22 93.75 240.97 93.75 351.22 177.75 236.47 177.75 121.72 177.75"; 

     string[] CurveDataStringParts = CurveDataString.Split(' '); 

     int[] Keep = {2, 3, 4, 5, 6, 7, 8, 9}; 
     float[] CurveData = (from i in Keep select float.Parse(CurveDataStringParts[i])).ToArray(); 

     e.Graphics.DrawBezier(Pens.Black, CurveData[0], CurveData[1], CurveData[2], CurveData[3], 
              CurveData[4], CurveData[5], CurveData[6], CurveData[7]); 

     for(int i = 0; i < CurveData.Length; i += 2) 
     { 
      e.Graphics.FillEllipse(Brushes.Black, new RectangleF(CurveData[i] - 2, CurveData[i + 1] - 2, 4, 4)); 
     } 

     base.OnPaint (e); 
    } 
} 

परिणाम:
Bezier example

+0

आपकी टिप्पणियों के लिए बहुत बहुत धन्यवाद! क्या आप "डिग्री ऊंचाई" का जिक्र कर रहे हैं? साथ ही, क्या आप उपरोक्त वर्णित केमड्रा में उपयोग किए गए बिंदुओं के लिए सी # फ़ंक्शन ग्राफ़िक्स.ड्रा फ़ेज़िएयर/ड्राबेज़ियर अभ्यास करने वाले बिंदुओं में अभ्यास करने के तरीके के बारे में कुछ और टिप्पणी करने में मदद कर सकते हैं? – SOUser

+0

@Xichen ली: संपादन में जोड़ा गया। – Dani

+0

आपके विस्तार के लिए धन्यवाद! क्या आपका मतलब है कि अगर मैं 'GetCurvePoints' को ChemDraw CurvePoints xml विशेषता, C# Graphics.DrawBezier में मौजूद डेटा को वापस करने देता हूं जैसा कि केमड्रा द्वारा प्रदर्शित वही वक्र उत्पन्न करेगा? मुझे खेद है, लेकिन (1) केमड्रा वक्र पॉइंट्स एक्सएमएल एट्रिब्यूट में ऊपर दिए गए चार उदाहरणों के लिए छह अंक हैं, (2) 'ड्राबेज़ियर' चार अंक स्वीकार करते हैं और (3) 'ड्राबेसियर' 4 + 3 एन अंक स्वीकार करते हैं। पीएस: मैंने उन छः बिंदुओं के साथ 'ड्राबेज़ियर' की आपूर्ति करने की कोशिश की और उन्हें एक ही या यहां तक ​​कि वैध तस्वीर नहीं मिल सका। क्या आप टिप्पणी करने में मदद कर सकते हैं? – SOUser

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