2013-03-06 54 views
2

我試圖在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工作。

在此先感謝。

+1

你肯定在'Base.aplicFractal 1UY Base.funcFractal1'所做的計算是給點回正確位置? – 2013-03-06 17:30:51

+1

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

+0

@TomasPetricek,確實有錯誤(你是怎麼猜到的?)的方法中,有所謂的兩個值'theta0'和'theta00 '(這些類似的可能是未經推薦的名稱有很長的解釋),用於在笛卡爾座標系中轉換極座標。現在它已經被修正了,'System.Drawing.Graphics.DrawLines'沒有問題。 – JMCF125 2013-03-07 16:09:55

回答

5

您在conectar中有一個錯誤。

fUtil gr caneta resto.Tail resto.Head 

應該

fUtil gr caneta resto ponto 

你已經匹配的頭部和尾部的匹配語句內。

以下代碼爲我繪製一條線。我沒有太多修改。

open System.Drawing 
open System.Windows.Forms 

let caneta = new Pen(brush = Brushes.Black, width = 1.0f) 
let original =    
    ([|new PointF(50.0f, 50.0f); new PointF(100.0f, 50.0f)|]) 

let form1 = new Form(Width = 400, Height = 400, Text = "Fractais (Teste - Windows Forms)") 

let conectar (gr:Graphics) (caneta:Pen) (pontos:PointF list) = 
    let rec fUtil (gr:Graphics) (caneta:Pen) (pontos:PointF list) pontoAnt = 
     match pontos with 
     | [] ->() 
     | ponto :: resto ->     
      gr.DrawLine (caneta, pontoAnt, ponto) 
      fUtil gr caneta resto ponto 
    fUtil gr caneta pontos.Tail pontos.Head 

form1.Paint.Add(
    fun e -> // (1) 
     original 
     |> List.ofArray   
     //|> aplicFractal 1uy Base.funcFractal1 
     |> conectar e.Graphics caneta) 

form1.Show() 

Application.Run(form1) 
+0

該死!我知道這是某種頭腦發熱的錯誤,我只是找不到在哪裏!謝謝你指出,回答我的問題。 – JMCF125 2013-03-06 21:01:51