मैं समझने की कोशिश कर रहा हूं कि कैम्ब्रिजॉफ्ट द्वारा विकसित उद्योग-अग्रणी रसायन उपकरण केमड्रा, बेजियर वक्र का निर्माण कैसे करता है, ताकि मैं अन्य कार्यक्रमों से बेजियर वक्र बिंदुओं का मैन्युअल रूप से अनुवाद कर सकूं/केमड्रा के लिए पहचानने योग्य वक्र डेटा में रूटीन (जैसे घर से बना डेल्फी/सी # यूटिलिटीज)। शुरू करने से पहले, मुझे यह स्वीकार करना होगा कि मैं पूछ रहा हूं कि कुछ ब्लैकबॉक्स आंतरिक रूप से कैसे काम करता है, और इसलिए किसी भी परेशानी के लिए माफी मांगना और किसी भी मदद की सराहना करना चाहता हूं!विश्लेषण करने में सहायता करें कि सॉफ़्टवेयर/प्रोग्राम बेजियर वक्र का निर्माण कैसे करता है
मैंने चेमड्रा में चार प्रकार के सबसे सरल बेजियर घटता बनाये हैं और उन्हें .CDXML फ़ाइल के रूप में सहेजा है, जिसमें वक्र अनुभाग अंत में चिपकाया गया है। दोनों .CDXML फ़ाइलों और संबंधित चित्रों को फाइलर्व से डाउनलोड किया जा सकता है। Download Bezier_curve_ChemDraw_sample here। ChemDraw trial edition can be downloaded here।
प्रश्न
प्रश्न 1. उदाहरण के लिए "पंक्ति" प्रकार की वक्र अंक ले लो, वहाँ समग्र दो अंक है कि मैं प्रयोग किया जाता है जब इस वक्र बनाने हैं। ChemDraw इसके लिए छह अंक क्यों स्टोर करता है? और ChemDraw वास्तव में इन बिंदुओं की व्याख्या कैसे करता है? वही प्रश्न अन्य तीन प्रकारों के लिए मौजूद है, जो अधिकतम चार स्पष्ट बिंदुओं को नियोजित करते हैं।
प्रश्न 2. यदि चेमड्रा में "तीन बिंदुओं का उपयोग करके बेजियर वक्र" सामग्री की सामग्री प्रदर्शित होती है, तो कोई भी पहली बिंदु (12.22, 104.25) नहीं देख सकता है। मेरा मतलब है, इसका एक्स समन्वय स्पष्ट रूप से 12 से बड़ा है। यह क्यों हो रहा है? क्या ChemDraw डेटा के साथ कुछ परिवर्तन करता है? "प्रश्न चार बिंदुओं का उपयोग करके बेजियर वक्र" के लिए एक ही प्रश्न मौजूद है।
प्रश्न 3. ऐसा लगता है कि CurvePoints विशेषता के अंत में अतिरिक्त खाली चरित्र अंतर बनाता है। वास्तव में क्या अंतर है?
क्या कोई मुझे इन समस्याओं के बारे में बता सकता है?
ChemDraw .CDXML फाइलों में वक्र वर्गों
============ लाइन ==============
<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
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
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
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
प्रकार को छोड़कर केमड्रा डिस्प्ले के समान वक्र उत्पन्न नहीं कर सकता।
विस्तृत सवाल की वजह से upvoted। –