私がやりたいこと?
この質問の更新:2012年7月10日-「gradientTransformは完全ではありません」Duopixelに触発されました2012年7月11日-「例からのSVGコード」2012年7月16日-「@dignifiedquireはこの問題に取り組みます」
ユーザーがポリゴンのサイズを動的に変更できるツールを作成しようとしています。ほとんどのポリゴンはグラデーションで塗りつぶされていfill="url(#top_surface_1_gradient)"
ます。私がこれを行う方法は、次のような単純なJavaScriptスクリプトです。
- 特定のポリゴン上でmousemove&clickイベントを探します
- 動きの量を測定します
- このアルゴリズムを使用してポリゴンの座標の半分を(ストレッチの効果を得るために)変更し、新しい座標を定義します。
x = x_movement
、y = x_movement * Math.tan( 31 * (Math.PI/180) )
- 単色で塗りつぶされたポリゴンはOKです
- グラデーションで塗りつぶされたポリゴンはそうではありません。
視覚的に
つまり、これはステップ1であり、ユーザーによるストレッチは行われていません。
ここで問題が発生します。x1, y1
グラデーションの座標と座標をどのように変更すればよいかわからないx2, y2
ため、ポリゴンが引き伸ばされている間、グラデーションは古い位置にぶら下がったままになります。その結果、奥行きの錯覚を維持できない形状になります。
私が探している最終結果。そして、グラデーションは最初から完全にランダムな角度を持っているかもしれないことを心に留めておいてください。この最終結果では、私が探しているのは、グラデーションの座標x1, y1
と座標の両方が変更されていることです。これらの位置を計算するには、どのアルゴリズムを使用する必要がありますか?勾配の角度を完全に知らない解決策を探しています。x2, y2
以下は、これらの例を生成するために使用されたすべての適切な座標を持つSVGです。
SVGコードの使用
ステップ1:
<!-- Step 1 -->
<linearGradient id="top_surface_1_gradient" gradientUnits="userSpaceOnUse" x1="165.3425" y1="39.7002" x2="-49.991" y2="43.0337">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_1" fill="url(#top_surface_1_gradient)" points="137.145,41.204 68.572,0 0,41.204 68.572,82.396"/>
ステップ2
<!-- Step 2 -->
<linearGradient id="top_surface_2_gradient" gradientUnits="userSpaceOnUse" x1="250.0491" y1="233.8115" x2="23.7637" y2="237.3146">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_2" fill="url(#top_surface_2_gradient)" points="205.788,215.557 137.215,174.354 0.078,256.629 68.649,297.823"/>
ステップ3
<!-- Step 3 -->
<linearGradient id="top_surface_3_gradient" gradientUnits="userSpaceOnUse" x1="248.4543" y1="454.5225" x2="-75.535" y2="459.5381">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_3" fill="url(#top_surface_3_gradient)" points="205.788,415.557 137.215,374.354 0.078,456.629 68.649,497.823"/>
私はこの問題の解決策を開発するのに数え切れないほどの時間を費やしてきましたが、頭を悩ませることはできませんでした。どんな助けでも大歓迎です。
更新:gradientTransformは完全ではありません
gradientTransform属性を使用し、x1、y1は使用しません。グラデーションのx2、y2座標を使用すると、ほぼ必要な方法でポリゴンを塗りつぶす結果が得られます(このソリューションはhttp://jsfiddle.net/hqXx2/にあります)。解が崩れる唯一の場所は、ポリゴンがポリゴンの外側から始まり、外側/内側のどこかで終わるグラデーションで塗りつぶされている場合です。説明させてください:
これは、Duopixelが提案しているソリューションで達成されることです。
これは、上記のソリューションでは実現できない使用例です。角度とグラデーションの停止を視覚的に増幅するために、色を変更しました。
例のSVGコード
正しく展開されたポリゴンのより大きなグループのコードは次のとおりです。
<g>
<linearGradient id="surface_center_inside_bottom_1_" gradientUnits="userSpaceOnUse" x1="167.7629" y1="634.5986" x2="-72.9039" y2="599.2647">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.8528" style="stop-color:#CCCCCC"/>
<stop offset="0.9954" style="stop-color:#CCCCCC"/>
</linearGradient>
<polygon id="surface_center_inside_bottom_9_" fill="url(#surface_center_inside_bottom_1_)" points="137.145,620.04 68.572,578.837 0,620.04 68.572,661.233"/>
<linearGradient id="surface_right_inside_side_1_" gradientUnits="userSpaceOnUse" x1="178.8889" y1="600.1787" x2="33.103" y2="517.9229">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.9816" style="stop-color:#A3A5A8"/>
</linearGradient>
<polygon id="surface_right_inside_side_3_" fill="url(#surface_right_inside_side_1_)" points="136.526,620.374 68.359,578.501 68.572,493.837 137.358,535.37"/>
<linearGradient id="surface_right_inside_side_2_" gradientUnits="userSpaceOnUse" x1="126.2664" y1="563.249" x2="-28.4" y2="621.916">
<stop offset="0" style="stop-color:#FF0000"/>
<stop offset="0.6698" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_right_inside_side_5_" fill="url(#surface_right_inside_side_2_)" points="68.573,661.239 0,620.036 0,535.036 68.573,576.231"/>
<linearGradient id="surface_center_outside_top_1_" gradientUnits="userSpaceOnUse" x1="167.3728" y1="533.5059" x2="-47.9608" y2="536.8394">
<stop offset="0.0016" style="stop-color:#FF0000"/>
<stop offset="0.6735" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_center_outside_top_3_" fill="url(#surface_center_outside_top_1_)" points="137.145,535.041 68.572,493.837 0,535.041 68.572,576.233"/>
</g>
そして、これが私が拡張する必要がある小さいもののSVGコードです:
<g>
<linearGradient id="surface_right_inside_side_4_" gradientUnits="userSpaceOnUse" x1="273.4377" y1="319.251" x2="78.0696" y2="209.0197">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.9816" style="stop-color:#A3A5A8"/>
</linearGradient>
<polygon id="surface_right_inside_side_9_" fill="url(#surface_right_inside_side_4_)" points="205.112,366.797 136.945,324.924 137.157,156.261 205.731,197.464"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="247.2952" y1="408.1992" x2="-103.1108" y2="356.7538">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.8528" style="stop-color:#CCCCCC"/>
<stop offset="0.9954" style="stop-color:#CCCCCC"/>
</linearGradient>
<polygon fill="url(#SVGID_1_)" points="205.731,366.465 137.157,325.262 0.021,407.536 68.592,448.729"/>
<linearGradient id="surface_right_inside_side_7_" gradientUnits="userSpaceOnUse" x1="160.3313" y1="296.623" x2="-52.0119" y2="377.1676">
<stop offset="0" style="stop-color:#FF0000"/>
<stop offset="0.6698" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_right_inside_side_6_" fill="url(#surface_right_inside_side_7_)" points="68.532,448.767 0,407.497 0.021,238.536 68.592,279.729"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="248.4749" y1="215.7417" x2="-75.5139" y2="220.7572">
<stop offset="0.0016" style="stop-color:#FF0000"/>
<stop offset="0.6735" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon fill="url(#SVGID_2_)" points="205.731,197.464 137.157,156.261 68.592,197.333 0.021,238.536 68.592,279.729"/>
</g>
@dignifiedquireはこの問題に取り組みます
私はテストサイトに@dignifiedquireの提案されたアルゴリズムを実装しました:これがテストリンクです。絶対から相対への変換を自分で行いましたが、通常は同じポリゴンxとyの変更値をグラデーションxとyに追加した場合と同じ結果が表示されます。これが主な問題です。これらの値を、上記の例のようにグラデーションを変換するような値に変換する方法はありますか?
さらに助けが必要です。