Построение картинки в F#
От: algoritm256  
Дата: 24.12.13 19:08
Оценка:
Здравствуйте! Проблема такова: Нужно построить картинку на Bitmap из значений массива y. Значения там хранятся в виде 0 и 1ю Проблема заключается в самом построении. Компилятор выдает ошибки:

Unexpected identifier in expression

в этом месте(выделяется temp перед [<EntryPoint>]):

  for i=0 to count-1 do
        y.[i]<- y1.[i]
     temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
     temp
[<EntryPoint>]

do Application.Run(avtomat(y, y1, count, zero))


И Incomplete structured construct at or before this point in implementation file .
Компилятор выделяет как ошибку конец строки

do Application.Run(avtomat(y, y1, count, zero))


Вот весь код:
#light

open System;
open System.Drawing;
open System.Windows.Forms;

let count=61
let zero= 0
let y =  Array.create count 0
        
let y1 = Array.create count 0 

    
let TorIt(x:int, count:int)=
    if x < 0 then x+count 
        else x % count

let f(y1:int, y2:int, y3:int)= y1 ||| y2 ||| y3;;

 let image = new Bitmap(600, 600);;
  let temp = new Form();;

let avtomat (y: int[], y1: int[], count:int, zero:int) =
    let y = Array.init count (fun i ->  if i=30 then 1 else 0)
    for i=0  to count-1 do
        for x2=0 to image.Width do
            for y2=0 to image.Height do
                if y.[i]=0 then image.SetPixel(x2,y2,Color.Red)
                else image.SetPixel(x2,y2,Color.Green)
                for g=0 to 100 do
     for i=0 to count-1 do
        y1.[i]<- f(y.[TorIt(i-1, count)], y.[TorIt(i, count)], y.[TorIt(i+1, count)])
     for i=0 to count-1 do
        y.[i]<- y1.[i]
     temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
     temp
[<EntryPoint>]
do Application.Run(avtomat(y, y1, count, zero))


Помогите пожалуйста с проблемой! Заранее спасибо!
Re: Построение картинки в F#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.12.13 19:29
Оценка:
Здравствуйте, algoritm256, Вы писали:

A>
A>     temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
A>

Добавьте недостающую закрывающую скобку для Add
Re[2]: Построение картинки в F#
От: algoritm256  
Дата: 24.12.13 20:26
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, algoritm256, Вы писали:


A>>
A>>     temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
A>>

S>Добавьте недостающую закрывающую скобку для Add

Спасибо! Исправил, что вы указали и кое-где еще код подправил. Теперь проблема: ArgumentOutOfRange exception( Parameter must be positive and < Height.)

вот в этом месте
else 
  image.SetPixel(w,h,Color.Green)
for g=0 to 100 do


Вот измененный код:

#light

open System;
open System.Drawing;
open System.Windows.Forms;

let count=61
let zero= 0
let y =  Array.create count 0
        
let y1 = Array.create count 0 

    
let TorIt(x:int, count:int)=
    if x < 0 then x+count 
        else x % count

let f(y1:int, y2:int, y3:int)= y1 ||| y2 ||| y3;;

 let image = new Bitmap(600, 600);;
  let temp = new Form();;

let avtomat (y: int[], y1: int[], count:int, zero:int) =
    let y = Array.init count (fun i ->  if i=30 then 1 else 0)
    for w=0 to image.Width do
      for h=0 to image.Height do
         for i=0  to count-1 do
            if y.[i]=0 then image.SetPixel(w,h,Color.Red)
            else 
              image.SetPixel(w,h,Color.Green)
            for g=0 to 100 do
     for i=0 to count-1 do
        y1.[i]<- f(y.[TorIt(i-1, count)], y.[TorIt(i, count)], y.[TorIt(i+1, count)])
     for i=0 to count-1 do
        y.[i]<- y1.[i]
     temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0))

temp
[<EntryPoint>]
avtomat(y, y1, count, zero)


Мне нужно в зависимости от значения i-го элемента массива, окрасить определенным цветом пиксель и вивести на битмап. Если не трудно, можете подсказать, где я туплю. Заранее спасибо!
Re[3]: Построение картинки в F#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.12.13 20:40
Оценка:
Здравствуйте, algoritm256, Вы писали:

A>Здравствуйте, samius, Вы писали:


A>Спасибо! Исправил, что вы указали и кое-где еще код подправил. Теперь проблема: ArgumentOutOfRange exception( Parameter must be positive and < Height.)


Не удивительно
A>
A>    for w=0 to image.Width do
A>      for h=0 to image.Height do
A>         for i=0  to count-1 do
A>

размеры картинки 600x600. Координаты пикселей начинаются с 0-я. Значит максимально допустимая координата — 599. А вы обращаетесь к методу SetPixel с координатой 600.
При этом у вас цикл по i оформлен правильно, до count-1.
надо чуток внимательнее.

З.Ы. вычисление свойств Width/Height у объекта Bitmap очень долгое. Будет лучше если вы однажды их запомните, или вынесете в константы, что бы не обращаться к этим свойствам на каждой итерации цикла.
Или если вам без разницы, с какой стороны ходить по картинке, можно вывернуть циклы наизнанку.
for w = image.Width - 1 to 0 do


Дело пойдет значительно быстрее.
То же можно сказать о функции SetPixel — очень дорого. Но пока не заморачивайтесь по поводу SetPixel.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.