2012-01-26 19 views
6

मैं निम्नलिखित जानकारी है:गणना केंद्र

  • radiusX (rx)
  • radiusY (ry)
  • x1
  • y1
  • x2
  • y2

एसवीजी स्पेक आपको परिभाषित करने की अनुमति देता है इसके त्रिज्या को निर्दिष्ट करके एक चाप, और प्रारंभ और अंत बिंदु। large-arc-flag और sweep-flag जैसे अन्य विकल्प हैं जो यह निर्धारित करने में मदद करते हैं कि आप प्रारंभ बिंदु को अंत बिंदु तक कैसे पहुंचा सकते हैं। More details here

मैं गणितीय रूप से इच्छुक नहीं हूं, इसलिए all of this समझना असंभव है।

मुझे लगता है कि मैं एक साधारण समीकरण की तलाश में हूं जिसके परिणामस्वरूप मुझे centerX और centerY मूल्यों को एसवीजी के आर्क कमांड द्वारा स्वीकार किए गए सभी तर्क दिए गए हैं।

किसी भी मदद की सराहना की है।

मैंने स्टैक ओवरफ्लो खोजा है और कोई भी जवाब सादे अंग्रेजी में समाधान की व्याख्या नहीं करता है।

उत्तर

1

मैं x- अक्ष रोटेशन प्रारंभ और अंत बिंदु के लिए = 0. समीकरण के मामले पर विचार कर रहा हूँ:

x1 = cx + rx * cos (StartAngle)

y1 = cy + ry * sin (StartAngle)

x2 = cx + rx * cos (EndAngle)

y2 = cy + ry * sin (EndAngle) समीकरण पा से

को छोड़कर कोण

ry^2 * (x1-CX)^2 + rx^2 * (y1-cy)^2 = rx^2 * ry^2

ry^2 * (x2-: आईआरएस हमें देता है सीएक्स)^2 + आरएक्स^2 * (वाई 2-साइ)^2 = आरएक्स^2 * आरई^2

इस समीकरण प्रणाली को हाथों से या गणित पैकेट की सहायता से विश्लेषणात्मक रूप से हल किया जा सकता है (सीएक्स, साइ) मेपल, गणित आदि)। वर्गबद्ध समीकरण के दो समाधान हैं (बड़े-आर्क-फ्लैग और स्वीप-फ्लैग संयोजन के कारण)।

+0

धन्यवाद लेकिन मुझे यह मानना ​​है कि मैं उस समीकरण को हल करने का तरीका नहीं हूं। – James

2

आप गणना करने के लिए इस जावास्क्रिप्ट फ़ंक्शन का उपयोग कर सकते हैं।

// svg : [A | a] (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ 

/* x1 y1 x2 y2 fA fS rx ry φ */ 
function radian(ux, uy, vx, vy) { 
    var dot = ux * vx + uy * vy; 
    var mod = Math.sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy)); 
    var rad = Math.acos(dot/mod); 
    if(ux * vy - uy * vx < 0.0) rad = -rad; 
    return rad; 
} 
//conversion_from_endpoint_to_center_parameterization 
//sample : convert(200,200,300,200,1,1,50,50,0,{}) 
function convert(x1, y1, x2, y2, fA, fS, rx, ry, phi) { 
     var cx,cy,theta1,delta_theta; 

     if(rx == 0.0 || ry == 0.0) return -1; // invalid arguments 

     var s_phi = Math.sin(phi); 
     var c_phi = Math.cos(phi); 
     var hd_x = (x1 - x2)/2.0; // half diff of x 
     var hd_y = (y1 - y2)/2.0; // half diff of y 
     var hs_x = (x1 + x2)/2.0; // half sum of x 
     var hs_y = (y1 + y2)/2.0; // half sum of y 

     // F6.5.1 
     var x1_ = c_phi * hd_x + s_phi * hd_y; 
     var y1_ = c_phi * hd_y - s_phi * hd_x; 

     var rxry = rx * ry; 
     var rxy1_ = rx * y1_; 
     var ryx1_ = ry * x1_; 
     var sum_of_sq = rxy1_ * rxy1_ + ryx1_ * ryx1_; // sum of square 
     var coe = Math.sqrt((rxry * rxry - sum_of_sq)/sum_of_sq); 
     if(fA == fS) coe = -coe; 

     // F6.5.2 
     var cx_ = coe * rxy1_/ry; 
     var cy_ = -coe * ryx1_/rx; 

     // F6.5.3 
     cx = c_phi * cx_ - s_phi * cy_ + hs_x; 
     cy = s_phi * cx_ + c_phi * cy_ + hs_y; 

     var xcr1 = (x1_ - cx_)/rx; 
     var xcr2 = (x1_ + cx_)/rx; 
     var ycr1 = (y1_ - cy_)/ry; 
     var ycr2 = (y1_ + cy_)/ry; 

     // F6.5.5 
     theta1 = radian(1.0, 0.0, xcr1, ycr1); 

     // F6.5.6 
     delta_theta = radian(xcr1, ycr1, -xcr2, -ycr2); 
     var PIx2 = Math.PI * 2.0; 
     while(delta_theta > PIx2) delta_theta -= PIx2; 
     while(delta_theta < 0.0) delta_theta += PIx2; 
     if(fS == false) delta_theta -= PIx2; 

     var outputObj = { /* cx, cy, theta1, delta_theta */ 
      cx : cx, 
      cy : cy, 
      theta1 : theta1, 
      delta_theta : delta_theta 
     } 
     console.dir(outputObj); 

     return outputObj; 
} 
+1

यह संदर्भित एसवीजी परिशिष्ट का एक अच्छा कार्यान्वयन है। दुर्भाग्यवश, यह सभी मामलों में काम नहीं करता है। कुछ (बहुत असामान्य नहीं) किनारे के मामले हैं जिनमें 'coe' की गणना करते समय sqrt के अंदर मान नकारात्मक है। Http://svn.apache.org/repos/asf/xmlgraphics/batik/branches/svg11/sources/org/apache/batik/ext/awt/geom/ExtendedGeneralPath.java में 'computeArc' देखें। ध्यान दें कि यदि मूल्य ऋणात्मक है, तो यह कार्यान्वयन केंद्र बिंदु (0,0) लेता है, जो मेरे लिए काम करता है। एक उदाहरण आरएक्स = आरई = 60 (0, 100) से (100, 0) के साथ एक चाप है। – brianmearns

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