我試圖在F#中繪製一個非定製的(我的意思是,簡單地創建一個默認窗體類的實例,而不是一個派生類的實例)System.Windows.Forms.Form
。在F中的Windows窗體中繪圖#
我已經創建了一個自定義表單,但我並不需要,也不需要像這樣的新複雜結構,所以我刪除了它,並且它簡化了代碼;這麼多,它停下來顯示圖像。
該問題必須在我創建的函數中繪製,即在另一個F#項目中。我已經創建了它(功能conect
)連接點按照它們提供的順序,不像System.Drawing.Graphics.DrawLines
,它以某種其他順序繪製點之間的線爲什麼還沒有注意到(也許從右到左,從上到下,因爲點代表)。
Programa.fs相關的代碼片段:
let pen = new Pen(brush = Brushes.Black, width = 1.0f)
let original =
([|new PointF(50.0f, 50.0f); new PointF(100.0f, 50.0f)|])
use form1 = new Form(Width = 400, Height = 400, Text = "Fractais (Teste - Windows Forms)")
form1.Paint.Add(
fun e -> // (1)
original
|> List.ofArray
|> Base.applyFractal 1uy Base.fractalFunc1
|> Base.conect e.Graphics pen)
如果lambda表達式,而不是什麼寫有e.Graphics.DrawLines(pen, original)
,就畫在列表中的點之間簡單的線條。
這裏的麻煩製造者方法,Base.fs,整個解決方案:
let conect (gr:Graphics) (pen:Pen) (points:PointF list) =
let rec usefulFunc (gr:Graphics) (pen:Pen) (points:PointF list) prevPoint =
match points with
| [] ->()
| point :: remainings ->
gr.DrawLine (pen, prevPoint, point)
usefulFunc gr caneta remainings.Tail remainings.Head
usefulFunc gr pen points.Tail points.Head
和被叫(從窗體初始化代碼段)和相關方法的簽名,在Base.fsi(我可以給你所有的全面的方法的實施,但它會佔用大量的空間,這可能是你已經成爲一個長期的問題閱讀):
val fractalFunc1 : points:PointF list -> PointF list
val applyFractal : stepNumber:byte -> fractalFunc:(PointF list -> PointF list) -> points:PointF list -> PointF list
val conect : gr:Graphics -> pen:Pen -> points:PointF list -> unit
對於這個特定的問題,我的搜索結果沒有。我想知道如何使功能conect
工作。
在此先感謝。
你肯定在'Base.aplicFractal 1UY Base.funcFractal1'所做的計算是給點回正確位置? – 2013-03-06 17:30:51
Devias mudar OS nomes DASvariáveis對英格爾底注德colocares一個pergunta,神腦ébastante estranho對NAO截止日葡萄牙語saiba。硒越權códigoCOM nomes德variáveisEM Alemao的POR exemplotambémvais estranhar bastante,電子FAZconfusão – 2013-03-06 22:05:49
@TomasPetricek,確實有錯誤(你是怎麼猜到的?)的方法中,有所謂的兩個值'theta0'和'theta00 '(這些類似的可能是未經推薦的名稱有很長的解釋),用於在笛卡爾座標系中轉換極座標。現在它已經被修正了,'System.Drawing.Graphics.DrawLines'沒有問題。 – JMCF125 2013-03-07 16:09:55