尋找一種在圖表上控制和移動形狀的方法我正在尋找一種使用 JSL 腳本在繪圖(圖形產生器)上控制和移動「繪製」形狀或一系列形狀的方法,以實現資料視覺化目的。將其視為使用一系列幀的動畫,然後滾動它們以給出運動的印象。
我所說的「繪製」形狀是指:
矩形 ()
我正在考慮採取以下方法,但我不確定如何執行此操作或是否有更好的方法:
- 編寫/繪製所需的形狀並將它們與變數(可以是行值)相關聯 - 我們稱之為框架
- 建構多個框架,具有不同位置所需的形狀,每個框架分配給不同的變量
例如
第 1 幀 - 形狀位於 (X+0,Y) 位置並與變數 (v = 1) 關聯
第 2 幀 - 形狀位於 (X+1,Y) 位置並與變數 (v = 2) 關聯
第 3 幀 - 形狀位於 (X+2,Y) 位置並與變數 (v = 3) 關聯
- 使用本地資料過濾器滾動選擇哪個變量,從而滾動繪製形狀的位置
我希望這(如我的範例所述)能夠給人以形狀沿著 X+ 方向移動的印象。
正如前面提到的,我不確定這是否有效,當選定的變數發生更改時,圖形生成器報告需要以某種方式更新/刷新,以刪除舊繪圖(覆蓋)以代替新繪圖。
我很想知道這樣的事情是否可能以及如何編碼。
自動化和腳本編寫數據探索和視覺化回覆:尋找一種在圖形上控制和移動形狀的方法您能否提供更好的例子來說明您嘗試想像的內容?例如,JMP 具有 Mousetrap(),它可以根據框架框中的遊標位置繪製內容
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
exx = 70;
exy = 70;
Report(gb)[FrameBox(1)] << Add Graphics Script(
Mousetrap(
exx = x;
exy = y;
);
Rect({exx - 10, exy - 10}, {exx, exy});
);
</CODE></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-751817" slang="en-US" mode="CREATE">回覆:尋找一種在圖形上控制和移動形狀的方法</LINGO-SUB><LINGO-BODY id="lingo-body-751817" slang="en-US" mode="CREATE"><PRE><CODE class=" language-jsl">x1 = y1 = x2 = y2 = 0;
keepRunning=1;
New Window( "Example", gb = Graph Box( Frame Size( 800, 800 ), Oval( x1, y1, x2, y2 ) ), <<ONCLOSE></ONCLOSE>
<P></P><iframe src="https://players.brightcove.net/6058004218001/default_default/index.html?videoId=6352215904112" width="960" height="540" allowfullscreen allow="encrypted-media"></iframe>Looks like some rusty physics.<P></P>
回覆:尋找一種在圖形上控制和移動形狀的方法這真的很整潔。
我想我可以找到它的用途,我很想嘗試它是如何工作的。
我現在熱衷於採取更被動的方法來解決我最初的問題,我沒有意識到你可以控制形狀的速度,隨著時間的推移加速度,就像克雷格的例子一樣。
回覆:尋找一種在圖形上控制和移動形狀的方法這看起來真的很棒,我想這就是我所追求的 - 我真的很喜歡這可以由時間驅動。
是否有可能讓它適用於更複雜的繪圖,例如:
填滿顏色( RGB 顏色( 255, 0, 0 ) );
矩形(50,90,60,80,1);
填滿顏色( RGB 顏色( 204, 0, 0 ) );
矩形 (51, 89, 59, 81, 1);
填滿顏色( RGB 顏色( 255, 0, 0 ) );
多邊形 ({59, 89}, {60, 90}, {50, 90}, {51, 89});
填滿顏色( RGB 顏色( 153, 0, 0 ) );
多邊形 ({60, 80}, {59, 81}, {51, 81}, {50, 80});
當形狀的底部撞擊 X 軸時,我希望能夠使其停止並保持在原位,而不是彈跳。
另外,在給定的時間過去後,我希望繪製的其他形狀進入螢幕並遵循相同的路徑,每個形狀都落在 X 軸上。
我已經嘗試過您發送的腳本,但不確定如何以正確的方式修改它 - 真的很聰明!
回覆:尋找一種在圖形上控制和移動形狀的方法是的,你可以這麼做。聽起來你的物體有一個剛性的形狀,你希望它在滿足某些條件時立即停止。不是逐漸減慢或扭曲。聽起來您將擁有多個可能隨著時間的推移而被釋放的物件。我將使用每個物件一行的資料表,其列名稱類似於以下內容:
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
然後我會寫兩個函數:UpdateRow(行號,deltaTime)和DrawRow(行號)。 UpdateRow 看起來可能看起來像這樣(未經測試,大致正確...):
UpdateRow = function({rowNumber, deltaTime}
if( dtQ:isActive[rowNumber],
dtQ:Xpos[rowNumber] += dtQ:Xvel[rowNumber] * deltaTime;
dtQ:Ypos[rowNumber] += dtQ:Yvel[rowNumber] * deltaTime;
// you might want the velocity to change as well, possibly using the deltaVelocity,
// make sure the Xs and Ys stay together
// do a test to see if still active
if( dtQ:y[rowNumber] <= 0, // whatever condition makes it stop
dtQ:isActive[rowNumber] = 0;
dtQ:isDrawing[rowNumber] -= 1; // count down until vanishes
)
}
When you add a row to the table (dtQ, above, I tend to use dt for a table not delta time!) make sure to set the row's value for isActive to 1, and if you want the non-active objects to eventually expire, set the isDrawing to 100 or 1000 to control how many cycles go by before it stops drawing.
DrawRow 函數看起來像這樣:
DrawRow = function({RowNumber},
if( dtQ:isDrawing[RowNumber],
// your code goes here. Add the dtQ:Xpos[RowNumber] to your X coords
// and same for Ypos/Y.
// .... use the color/size/shape values from the row if you find them useful
)
);
現在圖形腳本變成了 dtQ 上的一對循環,第一個循環應用更新,第二個循環進行繪圖。您不必將它們分開,但如果您決定處理碰撞,您可能會發現它會很有幫助。
在此範例中,dtQ 中的資料表也可以透過圖形產生器透過繪製 xpos、ypos、顏色、大小、形狀值來顯示。 GraphBuilder 將自動更新,您不需要 DrawRow 函數。我從未使用過它,但我認為可能有一個針對點的自訂形狀繪製機制。
如果您嘗試製作影片(而不是互動式即時顯示),請選擇 30 或 60 FPS,並讓幀與幀之間的增量時間保持恆定。在上面,我選擇了使其在我的機器上運行的數字。但如果我選擇 1/30 並製作一組編號圖像,它們會製作出非常流暢的影片。