2017-05-05 51 views
3

我正在使用版本3.x中的D3.js。帶有點沿路徑插值的元素旋轉 - 在帶弧的路徑上不可能?

以下this教程,我試圖沿路徑移動一個元素,在這種情況下是一個矩形,並根據它在路徑上的位置來旋轉元素。

這對於任何路徑都是完美的,沒有弧線作爲它的一部分。事情是這樣的:

M56.200012207,96.1999969482c-51295,-52,294,280,184c-286,-273,-243,-261,-35,-204

的角度計算出 「正確」 上像這樣的路徑,並且元素順暢地沿着這條路徑平移。

但是,只要路徑包含弧線,該角度在弧線的某些點處會獲得一些奇怪的值,因此矩形會在沿路徑平移的同時基於此角度翻轉/跳轉。與弧形的路徑看起來像這樣的例子:

M56.20001220703125,66.19999694824219a174.796117,174.796117,0,1,0,275.99999999996874,-2.000000000042192

我的假設:

作爲創建一個弧,我們只給出一些數值,比如起點和角度,其餘的繪製弧點需要用svg來計算。 基於我的嘗試,我看到一些計算點實際上並不是我期望它們的位置。

Screenshot_1

在鏈接的例子中使用的函數計算的兩個點P1和P2,並通過對P1和P2使用Math.atan2計算旋轉角度。 我知道這些點非常接近,但爲了簡化我的解釋,我在圖像中他們之間有一定的距離。 在這張圖片中,我預計p1 x和y的值要小於p2。 p1和p2之間的區域有很多點,所以函數會計算這些對中每個對的所需角度。對大部分孩子來說,這個角度是正確的,但不是所有的人都爲能在下面的console.log中可以看出()輸出:

output of p1, p2 and angle

注意,對於大多數分,角度爲約67度,在路徑的相應區域應該是這樣的。但是隨機地有一個角度是33度,這當然會造成這種翻轉/跳躍效果。

對於「期望的角度」的過渡看起來不錯,是這樣的:

working

「未預期的角度」,過渡看起來不好,是這樣的:

not working

如果在整個過渡期間發生這種情況幾次,則會產生翻轉/跳躍效果。

我的問題:

這究竟是爲什麼?弧線看起來很好,並且所有點似乎都基於在屏幕上直觀地看着它們。 有沒有什麼辦法可以避免這種情況,同時仍然可以使用弧內的路徑?

非常感謝您的幫助。

編輯:添加了的jsfiddle向你展示這裏討論的問題和意見:Element rotation with point-along-path interpolation - not possible on path with arc?

+0

你有一些測試代碼嗎? – Ian

+1

請在你的問題中包含一個[MCVE] –

+2

我注意到dy的(在p1.y和p2.y之間)對於其他點大致爲1.0。但是,這一點大約是0.46。所以,看起來你的道路上有一些東西。該位置是否與新的路徑命令或連接對應? –

回答

2

有一個在目前的Chrome(57和58作爲寫作的),其工作時getPointAtLength()影響返回值的bug在弧路徑命令上。

https://bugs.chromium.org/p/chromium/issues/detail?id=719516

現在似乎有沒有其他簡單的辦法不是平滑的輸出值自己。或避免你的路徑中的弧命令。