2013-11-20 21 views
1

Affine類作爲延伸Transform類在JavaFX是否可以在JavaFX中實現透視變換?

這使人產生錯覺,除了仿射之外,還有一些類型的變換。

UPDATE

JavaFX 2.xTransform類包含只對特定的矩陣元素,其中包括3×4矩陣的12種元素的三維仿射變換的吸氣劑。任何類的使用只能依賴於這些元素,所以任何表示的轉換都是仿射的。

這意味着2.x版本的設計不好,因爲基本類只能表示仿射變換,而Affine是它的子類。這是錯誤的,因爲Affine應該成爲基礎班。

JavaFX 8Transform類有更好的設計。除了獲取者之外,它還索引對矩陣元素的訪問權限並確定matrix type。它也有transform()方法,它們進行實際轉換。

這意味着,該用法既可以依賴於transform()方法,也可以依賴於矩陣元素獲取器。

如果可以保證,JavaFX的所有內部部分依賴於transform()方法,那麼這個類可以擴展並且可以實現透視變換。可能它甚至可以在發佈版本JavaFX8中實施。

現在的問題是:可以保證,JavaFX只依賴transform()方法嗎?

回答

1

是的,數學中有非仿射變換。

不,這些非仿射變換不受JavaFX 2.2 Transform類的支持,也不支持JavaFX 8 Transform類。 Transform類或其任何子類都無法設置執行非仿射變換所需的變換矩陣元素。

您可以將PerspectiveTransform應用於2D節點。有關使用示例,請參閱我對Stretching Polygon to other Polygon with Java的回答。

要了解非仿射變換的數學,請參見Petzold's explanation。您可以使用2d transforms的類似數學。是的,我意識到Petzold的例子不是JavaFX的例子。但是,數學仍然成立,您可以通過PerspectiveTransform或使用自定義矩陣定義修改TriangleMesh中的點將其應用於JavaFX。

請注意,PerspectiveTransform的侷限性在於拾取(鼠標選擇)不起作用。拾取可以用於轉換的TriangleMesh,但是網格本身不是一個普通的JavaFX節點,只是一組陰影面。

+1

如果我不能擴展'Transform'來獲得非仿射變換,那麼JavaFX中的類層次結構是錯誤的,對吧?他們應該以'Affine'作爲基地,其他人作爲後代。 –

+0

我認爲這個層次是正確的。以Transform爲基礎,未來(例如Java 9)版本可以用NonAffineTransform子類擴展Transform,但如果Affine是root,那麼這就沒有意義了。 – jewelsea

+0

那麼,有可能將'Transform'擴展成一些非仿射的? –

相關問題