0

...我顯然太愚蠢找出我怎麼能拖電阻的另一點: http://www.3lectronics.com/electronics-layout/resistor.svgJavaScript的SVG拖

SVG事件,父母,子女和其他家庭花費的時間,我越來越瞭解。

如果有人想幫忙,

非常感謝。

+1

誰是彼得?如果您可以鏈接到您的舊問題並鏈接一些關注特定問題的代碼。人們會更願意提供幫助。 – sealz

+1

或者這個問題本可以作爲對原始問題的評論添加。 – Jason

+1

你好!我是彼得。當我抽出時間時,我會看看我能否回答這個問題。原來的問題是在http://stackoverflow.com/questions/7055607/trying-to-rotate-and-transform-svg-path-do-i-need-trigonometry-calculations –

回答

1

我想我喜歡你所要求的東西:http://dl.dropbox.com/u/169269/resistor2.svg 無論如何它應該讓你開始。

現在它變得更加複雜,但應該更容易添加更多元素。我懷疑必須有一個更簡單的方法,但這是一個有趣的挑戰。它現在使用矩陣變換,我認爲這是必要的(因此,如果您不知道它們,您需要了解它們),因爲您需要跟蹤以前的變換。我建議在看http://www.w3.org/TR/SVG/coords.html#NestedTransformations

新的拖放功能如下:

function drag(evt) 
{ 
    if(selected_element != 0) 
    { 
     dx = rotate_x - evt.pageX; 
     dy = rotate_y - evt.pageY; 

     new_size = Math.sqrt(dx*dx + dy*dy)/element_size; 
     new_angle = Math.PI/2 + Math.atan2(dy, dx); 
     delta_size = new_size/current_size; 
     delta_angle = new_angle - current_angle; 
     current_size = new_size; 
     current_angle = new_angle; 

     new_matrix = new Array(6); 

     // Scale 
     for (i=0; i<6; i++){ 
      current_matrix[i] = current_matrix[i] * delta_size; 
     } 
     current_matrix[4] = current_matrix[4] + (-delta_size) * rotate_x; 
     current_matrix[5] = current_matrix[5] + (-delta_size) * rotate_y; 


     for (i=0; i<6; i++){new_matrix[i] = current_matrix[i]; } 

     // Rotate around (0,0) 
     cos_theta = Math.cos(delta_angle); 
     sin_theta = Math.sin(delta_angle); 
     new_matrix[0] = cos_theta*current_matrix[0] - sin_theta*current_matrix[1]; 
     new_matrix[1] = sin_theta*current_matrix[0] + cos_theta*current_matrix[1]; 
     new_matrix[2] = cos_theta*current_matrix[2] - sin_theta*current_matrix[3]; 
     new_matrix[3] = sin_theta*current_matrix[2] + cos_theta*current_matrix[3]; 
     new_matrix[4] = cos_theta*current_matrix[4] - sin_theta*current_matrix[5]; 
     new_matrix[5] = sin_theta*current_matrix[4] + cos_theta*current_matrix[5]; 

     // Transform back to original point 
     new_matrix[4] += rotate_x; 
     new_matrix[5] += rotate_y; 

     transform = "matrix(" + new_matrix.join(' ') + ")" ; 
     selected_element.setAttributeNS(null, "transform", transform); 
     current_matrix = new_matrix; 
    } 
} 

它類似於以前只是現在它測量自上次拖事件的角度和距離的差異。

的電阻器組的樣子:

<g class="resistor" transform="matrix(1 0 0 1 0 0)" onmouseup="deselectElement()" size="200"> 
    <line x1="200" y1="200" x2="200" y2="400" stroke="blue" stroke-width="5" pointer-events="none"/> 
    <rect x="180" y="250" width="40" height="100" stroke="blue" fill="white" stroke-width="5" pointer-events="none"/> 
    <circle cx="200" cy="200" r="10" fill="blue" onmousedown="selectElement(evt, 200, 400)"/> 
    <circle cx="200" cy="400" r="10" fill="blue" onmousedown="selectElement(evt, 200, 200)"/> 
    </g> 

要注意的要點是,主組的大小屬性,它告訴函數的電阻應該有多長。圓圈具有selectElement函數,並傳遞另一個圓的座標以指示旋轉和縮放應該是關於此點的。我相信有更好的方法來做到這一點。

+0

我也確定一切都有更好的方法去做,但是你的努力讓我開始思考對這個和其他類似問題應該做些什麼。請記住,我剛剛開始使用JS和SVG,實際示例對於我學習如何解決某個問題是非常寶貴的經驗教訓。 – Alex

+0

順便說一句,這段代碼只適用於Chrome(在我的Linux Mint上),並且我開始使用Chrome的JS控制檯,它給了我:「Resource解釋爲Document,但是使用MIME類型image/svg + xml傳輸。」。它也使它自己縮進。我將那些縮進的代碼複製爲resistor3.svg,現在在Opera和Midori中運行(仍然不在Firefox中)?一些愚蠢的瀏覽器規則! (http://www.3lectronics.com/electronics-layout/resistor3.svg) – Alex

+0

請不要打擾,我有足夠的工作人員練習,你給我一個很大的忙。 我該如何回報你?如果你去亞得里亞海海岸,我會很樂意請求我的朋友在靠近海灘的一些公寓裏(Split-Croatia附近)給你住一段時間。如果您需要,也可以幫助您進行電子設計。 不要猶豫。 非常感謝! – Alex