Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

test test

Автор RawonaM, августа 27, 2008, 07:16

0 Пользователи и 3 гостей просматривают эту тему.

Тайльнемер

Цитата: Валентин Н от апреля 10, 2012, 20:00
Вобщем сделать внизу аватарки поле ввода текста.
Это без правки кода форума не сделать.

Валентин Н

ЗАБАНИЛ ВИКИПЕДИЮ
Нижниь ıндэкс в ҷıсʌах — степень тıсяҷı
Препинания авторские!

Валентин Н

А как узнать какие есть ограничения на вставку аватаров? Разве нельзя туда впихнуть интерактивный объект?
Подозреваю, что нет.
ЗАБАНИЛ ВИКИПЕДИЮ
Нижниь ıндэкс в ҷıсʌах — степень тıсяҷı
Препинания авторские!

arseniiv

Цитата: Тайльнемер от апреля 10, 2012, 20:05
Лиссажу я сделал через Graphics, но не в WPF.
А в WPF Graphics не используется. Там просто создаются объекты типа Прямоугольник, Эллипс, КриваяБезье и т. п., помещаются в объект-контейнер, а потом у него вызывается метод ОтрендеритьВБитмэп. А можно всё то же самое описать декларативно на XAML'е.
Учту. А лицо в чём сделали?

Цитата: Тайльнемер от апреля 10, 2012, 20:05
Можно поподробнее, а то я не понял?
Ну, сделать сервис с генерацией картинок по тексту задания, который учитывает случайность. Тогда, чтобы каждый раз не парсить описание, можно его скомпилировать. Хотел привести в пример Context Free, но там довольно навороченный местами синтаксис.

Язык какой-нибудь с простой грамматикой; типа

// вычисленное кидается в один стек, «ожидающие» функции в другой с пометкой, сколько ждать аргументов осталось перед применением
def randPoint:0 {
  pt rand W rand H // pt:2 → пара, rand:1 → число, W:0 → текущая ширина, H:0 → тек. высота
}

def main:0 {
  setH 120 setW 120 // setW:1, setH:1
  moveTo / pt W H 2 // moveTo:1, /:2 → число
  fillColor rgba .2 .2 1 0.5 // fillColor:1, rgba:4 → цвет
  fillRect / randPoint 2 // fillRect:1 (центр в текущих координатах, а параметр — размеры)
}

(Ой, язык получился достаточно страшным уже сейчас, а я столько не упомянул (для удобного рисования (если такое можно считать удобным, мало ли)). Но если понравится — поделаю. Или другой.)

И пусть для оптимизации скрипты, не использующие случайное рисование (какие-нибудь таинственные иероглифы), помечаются как-нибудь, и тогда будет храниться сгенерированное один раз изображение.

arseniiv

Ах да, ещё надо будет не упустить возможность генерировать понравившуюся картинку снова, указывая random seed при желании (и оно будет выдаваться при рисовании куда-нибудь; например, в окно предпросмотра). А то я тут подумал, что можно было бы сделать ещё один вид смайликов из этих лиц.

Тайльнемер

Цитата: arseniiv от апреля 11, 2012, 10:37
А лицо в чём сделали?
Всё в том же.

Но щас я подумал, можно генерировать вообще на растр, а svg.

Цитата: arseniiv от апреля 11, 2012, 10:37
Язык какой-нибудь с простой грамматикой; типа
Чтобы описывать разные достаточно сложные картинки, придётся делать очень сложный язык. Тогда может быть вообще лучше писать картинки сразу на языке программирования, скажем на F# (функциональный язык, исполняемый под .net).

arseniiv

Цитата: Тайльнемер от апреля 11, 2012, 11:36
Но щас я подумал, можно генерировать вообще на растр, а svg.
Да, да, да! :yahoo: Странно, что я забыл про него. Тут будет намного лучше с поворотами и масштабированием!

Цитата: Тайльнемер от апреля 11, 2012, 11:36
Чтобы описывать разные достаточно сложные картинки, придётся делать очень сложный язык. Тогда может быть вообще лучше писать картинки сразу на языке программирования, скажем на F# (функциональный язык, исполняемый под .net).
На F#? Не думаю, что он удачен (не знаю, зачем они его вообще сделали). После Haskell мне как-то F# не идёт. :(

Кстати, почему достаточно сложный? Количество стандартных функций можно легко увеличивать, синтаксис не будет меняться, единожды написанный. А с реализацией, думаю, справлюсь.

Предлагаю пока эскиз грамматики языка в текущем варианте:

Скрипт → { Определение }
Определение → "def" Имя ":" Арность "{" Код "}"
// строка выше слишком кажется засахаренной, все эти скобки, что это я... Альтернатива ниже:
Определение → Имя ":" Арность Код end
Код → { КонструкторЗначения }
КонструкторЗначения → Имя | "." Имя | "#" [ Число ] | Число | Строка(?) | Bool(?) // остальные типы «исходят» из стд. функций
// точка перед именем выдаёт значение-функцию
// для вызова надо будет передать его в что-то типа call или покороче из символов
// #3 = третий аргумент функции. # = #1


Меня сейчас больше беспокоит количество типов данных и операций для удобного рисования: цвета нужно уметь сдвигать в разные стороны (осветлять, затемнять, усинять, к примеру), как и точки (деление уже показано, хоть это и неестественная операция для точек (тут точка заменяет вектор)) и что-нибудь ещё, чтобы можно было с помощью рекурсии делать красоту. :)

arseniiv


Тайльнемер

Цитата: arseniiv от апреля 11, 2012, 12:10
На F#? Не думаю, что он удачен (не знаю, зачем они его вообще сделали). После Haskell мне как-то F# не идёт.
Жаль, что вы не продолжаете уроки Хаскеля...
А можете вкратце рассказать про то, чем плох F# вообще и в сравнении с хаскелем в частности?

Цитата: arseniiv от апреля 11, 2012, 12:10
Предлагаю пока эскиз грамматики языка в текущем варианте:
Я пока ещё не вник.  Щас подумаю.

Цитата: arseniiv от апреля 11, 2012, 12:12
В SVG много примитивов?
Графические примитивы такие:
'animation', 'circle', 'ellipse', 'image', 'line', 'path', 'polygon', 'polyline', 'rect', 'text', 'textArea', 'use', 'video'.

arseniiv

Цитата: Тайльнемер от апреля 11, 2012, 12:35
Жаль, что вы не продолжаете уроки Хаскеля...
Я надеюсь скоро продолжить. Надо вконец победить это своё разрывание дел. :what:

Цитата: Тайльнемер от апреля 11, 2012, 12:35
А можете вкратце рассказать про то, чем плох F# вообще и в сравнении с хаскелем в частности?
Тут у меня мнение некомпетентное и основанное на слухах, так что я лучше смолчу. Сейчас посмотрю на него ещё раз.

Цитата: Тайльнемер от апреля 11, 2012, 12:35
Графические примитивы такие:
'animation', 'circle', 'ellipse', 'image', 'line', 'path', 'polygon', 'polyline', 'rect', 'text', 'textArea', 'use', 'video'.
Не так уж и много! :) (Интересно, что круг и эллипс разведены.) Video использует внешнее видео? Наверно, его можно не трогать здесь(?)

arseniiv

Типы-размерности в F# порадовали. Нигде пока такого не видел. Но после хаскеля у меня глаза плохо открываются.

В общем, мне ещё кажется, что использовать целый F# для этого — электронный микроском вместо лупы. Но если всё закрутится быстро, то можно будет ещё раз подумать.

Квас

Пишите письма! :)

Валентин Н

ЗАБАНИЛ ВИКИПЕДИЮ
Нижниь ıндэкс в ҷıсʌах — степень тıсяҷı
Препинания авторские!

Квас

Моя тайна раскрыта. :) К сожалению, прямые греческие в формулах на форуме не получаются. :(
Пишите письма! :)

mnashe

Цитата: Тайльнемер от апреля 10, 2012, 20:05
Лиссажу я сделал через Graphics, но не в WPF.
А что такое Graphics?
Я как-то давно искал что-нибудь простое, где можно было бы рисовать фигуры Лиссажу и т.п., то есть задавать x и y независимыми функциями одного и того же аргумента, а не y=f(x). Так и не нашёл.
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Тайльнемер

Цитата: arseniiv от апреля 11, 2012, 12:54
В общем, мне ещё кажется, что использовать целый F# для этого — электронный микроском вместо лупы.
Это-то конечно да. Но зато  как это облегчает задачу. Нам не нужно писать ни парсер, ни интерпретатор., ведь F#-овские файлы компилируются на сервере сами по себе.

Просто написать код для генерации SVG, типа:
Цитата: Svg.fs
module AvatarLib.Svg

open System
open System.Xml.Linq

let private xmlns = XNamespace.op_Implicit("http://www.w3.org/2000/svg")
let private xElement name attributes value = XElement(xmlns + name, List.append (attributes : obj list) (value : obj list))
let private xAttribute name value = XAttribute(XName.op_Implicit(name), value)

let private pairSeparate separator (x, y) =
  sprintf "%A" x + separator + sprintf "%A" y

let rec private listSeparate separator list =
  List.reduce (fun acc item -> acc + separator + item) list

// Svg elements:

let root (width, height) (viewX, viewY) (viewWidth, viewHeight) contents =
  xElement "svg"
    [
    xAttribute "version" 1.2
    xAttribute "baseProfile" "tiny"
    xAttribute "width" width
    xAttribute "height" height
    xAttribute "viewBox"
      <| sprintf "%A %A %A %A" viewX viewY viewWidth viewHeight
    ]
    contents

let rect (x, y) (width, height) =
  xElement "rect"
    [
    xAttribute "x" x
    xAttribute "y" y
    xAttribute "width" width
    xAttribute "height" height
    ]
    []

let ellipse (cx, cy) (rx, ry) =
  xElement "ellipse"
    [
    xAttribute "cx" cx
    xAttribute "cy" cy
    xAttribute "rx" rx
    xAttribute "ry" ry
    ]
    []
 
let path points =
  xElement "path"
    [
    xAttribute "stroke" "black"
    xAttribute "stroke-width" 0.008
    xAttribute "fill" "none"
    xAttribute "d" <| "M " + listSeparate " L " (List.map (pairSeparate " ") points)
    ]
    []

(Ну, это пока ещё набросок, который даже цвета не поддерживает)


И тогда можно писать хендлеры, типа:
Цитата: FunHandler.ashx
<%@ WebHandler Language="F#" Class="Handlers.FunHandler.FunHandler" %>

namespace Handlers.FunHandler
 
open System.Web
open AvatarLib
 
type FunHandler() =
 
  let rand =
    let rndGen = new System.Random(int System.DateTime.Now.Ticks)
    (fun max -> float (rndGen.Next(max)))
 
  let π = System.Math.PI
 
  let wave freq phase x =
    sin (freq * (x * π - phase))
 
  let lissajous freqX freqY phaseX phaseY t =
    (wave freqX phaseX t, wave freqY phaseY t)
 
  let parametricGraph start stop steps func =
    [
    for i in [0 .. steps] ->
      let t = start + (stop - start) * (float i) / (float steps)
      func t
    ]
   
  let svgFile =
    Svg.root (140, 140)
      (-1.01, -1.01) (2.02, 2.02)
      [
      lissajous (1. + rand 6) (1. + rand 6) (rand 6 / 6.) (rand 6 / 6.)
      |> parametricGraph -1. 1. 360
      |> Svg.path
      ]
 
 
  interface IHttpHandler with
    member this.ProcessRequest(context:HttpContext) =
      context.Response.ContentType <- "image/svg+xml"
      //svgfile.save(context.Response.OutputStream)
      context.Response.End()
    member this.IsReusable with get() = true


И по запросу http://teilnehmer.somee.com/Avatar/FunHandler.ashx сразу получим:

Вадимий

Сделайте ещё, чтоб рандомным цветом

arseniiv

Наверно, сдамся — но я же любитель пописать парсеры.

Если делать с F#, тогда надо будет написать модуль для относительного рисования (хочется сделать что-то похожее на принцип Context Free).

namespace AvatarLib.Relative

type DrawingContext =
  { x: double; y: double;
    scaleX: double; scaleY: double;
    fillColor: Color; color: Color } // вроде ничего не упустил
// не помню, .NET Color поддерживает ли полупрозрачные цвета. Если нет, свой определим

// тут бы монада хорошо подошла, с их заменителями в F# у меня пока нет опыта. А так можно сделать функциям рисования и изменения параметров контекста контекст первым параметром и каррингом остальные, и можно бы использовать операцию <|
// типа такого примера будет:

image 120 120 60 60 <blue> <red> // w, h, начальные x и y, цвета не знаю как указывать
  <| rect 30 40 // w, h
  <| fillColor <green>
  <| f

let rec f ctx =
  if <random> < .9 then // с вероятностью 0,9 продолжим рисовать цепочку
    ctx <| fillCircle 10 <| scaleRel .9 .9 <| fillColorHueRel .01 <| f
  else
    ctx <| scaleRel 4 4 <| fillColor <red> <| fillCircle 10

// не знаю, верен ли синтаксис кроме незнакомых мне пока частей

Тайльнемер

Цитата: mnashe от апреля 12, 2012, 12:53
А что такое Graphics?
Это класс в дот-нете, оболочка для GDI+ — графического интерфейса Windows.

Цитата: mnashe от апреля 12, 2012, 12:53
Я как-то давно искал что-нибудь простое, где можно было бы рисовать фигуры Лиссажу и т.п., то есть задавать x и y независимыми функциями одного и того же аргумента, а не y=f(x). Так и не нашёл.
Я не знаю.

Тайльнемер


Demetrius

Цитата: Тайльнемер от апреля 10, 2012, 20:05
А в WPF Graphics не используется. Там просто создаются объекты типа Прямоугольник, Эллипс, КриваяБезье и т. п., помещаются в объект-контейнер
По-моему кто-то в Microsoft переизобрёл canvas из Tcl. ;D

arseniiv

Ну, в VCL тоже есть Canvas с теми же функциями. Уж эти оболочки!‥

Demetrius


Demetrius

Кстати, много ссылок на вещи типа Context Free Art и подобное — тут:
http://blog.hvidtfeldts.net/index.php/generative-art-links/

arseniiv

Эврика! Я понял, какой тип данных мне нужен. Неизменяемый кортеж, который нельзя индексировать, и можно получить его компоненты лишь все целиком. Вот оно! Не нужно два типа чисел (целые и нецелые), не нужны массивы отдельно от таблиц для производительности операций со структурами фиксированного строения! Берём и действуем. Цвет, точка, прочие вещи отлично вписываются. Правда, не знаю, нужно ли прикреплять тег с названием фактического типа (например, Color, Point) — тогда можно было бы использовать переопределение операций и складывать точки так, а цвета не так. Хотя, наверно, это ерундища. Идея в начальном виде куда лучше.

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр