Короткая программа для рисования


13

Вы только что пригласили специалиста гуманитарных наук в свой дом, и вы говорите ему / ей

«Вы знаете, я отличный программист, и я могу делать х и у и г ...»

Он быстро скучает и спрашивает:

«Если вы действительно хороший программист, можете ли вы создать программу, позволяющую мне рисовать, мне просто нужно рисовать линии на экране с помощью мыши и выбирать разные цвета любым способом».

Ваш код может импортировать стандартные библиотеки. Ваш код может потребовать, чтобы цвета выбирались с клавиатуры.

Это ; самый короткий код выигрывает.

Отверстия от пуль

  • Линии нарисованы, перемещая мышь вокруг, нажимая левую кнопку.

  • Линейный алгоритм Брезенхэма не нужен, любой встроенный алгоритм поможет

  • Если пользователь может каким-либо образом изменить толщину линии, вы получите бонус * 0,8, но это не обязательно.

  • Я думаю, что было бы лучше реализовать рисование линий самостоятельно, но если вы хотите, вы можете импортировать библиотеку для этого, просто скажите это в описании кода.

  • Минимум 5 разных цветов (красный, зеленый, синий, белый, черный). Если вы сделаете их случайным образом, вы получите штраф * 1.2. Вы можете изменить их по своему усмотрению (как кнопки, так и нажатия клавиш в порядке).

  • Рисовать их, нажимая мышь между точками или от руки, было бы лучше (то есть, как вы делаете в рисовании) и дает вам бонус * 0,7, но любой другой метод в порядке: (пример) щелкните две точки и проведите линию между этими точками ?

  • Холст для рисования должен быть 600х400

  • Изменение цвета должно изменить цвет только тех линий, которые будут нарисованы в будущем.

  • Выполнение команды «Очистить все» не обязательно, но если вы реализуете это, вы получаете бонус * 0,9 .


2
Как линии должны быть нарисованы? Линейный алгоритм Брезенхэма ? Линии должны быть переменной толщины? Нужно ли нам самим рисовать линии? Пожалуйста, уточните больше. И обычно предполагается, что наш код может «импортировать стандартные библиотеки». Сколько цветов должно быть выбрано? 2 хорошо? Или как насчет случайного выбора цвета при каждом нажатии кнопки клавиатуры?
Джастин

2
Нужны еще некоторые уточнения: как нарисованы линии? Вы нажимаете две точки и рисуете линию между этими точками? Насколько большим должен быть холст для рисования? Сколько цветов должно быть поддержано? Может ли изменение цвета изменить цвет любой другой линии? И т.д. Эта проблема в настоящее время очень не уточнена.
Дверная ручка

@Quincunx Я поставил вопрос и ответь на вопрос, скажи мне, все ли в порядке сейчас.
Caridorc

2
1. Пожалуйста, соберите все вопросы и ответы. Устраните Вопросы и заставьте Ответы стоять сами по себе в качестве маркеров. Обратите внимание, что комментарии иногда могут быть удалены. Точка алгоритма Брезенхэма не имеет смысла без прочтения комментария. Я предполагаю, что вы говорите, что алгоритм Брезенхэма не требуется, и подойдет любой алгоритм или стандартная / библиотечная функция. 2. В конечном итоге выигрыш зависит от того, на каком языке легко войти в API и получить доступ к правой кнопке (вместо обычной левой кнопки).
Level River St

2
1. «Рисовать их, нажимая мышь между двумя точками, лучше, но любой другой метод в порядке». Как насчет рисования от руки, как с помощью карандаша в краске? Я предлагаю вам сделать это более понятным или вообще исключить «любой другой метод в порядке». 2. Способ изменения цвета должен быть лучше определен. Например, можно ли это сделать с клавиатуры, вращая цвета с помощью другой кнопки мыши, или это нужно делать, щелкая экранную палитру?
Уровень Река St

Ответы:


9

HTML + jQuery + CSS - 507 x (0,7 x 0,8 x 0,9) = 255,528

Не так коротко, как я думал, но мне нравится результат.

Функции:

  • Нажмите и перетащите режим рисования. ( 0,7 )
  • Семь цветов (черный + радуга).
  • Переменная ширина кисти (управление ползунком). ( 0,8 )
  • Очистить все функции. ( 0,9 )

Демонстрация в реальном времени: http://jsfiddle.net/onsLkh8y/9/


HTML - 84 байта

<input id="r" type="range" min="1" max="9"><canvas id="c" width="600" height="400"/>

CSS - 35 байт

#c{border:1px solid;cursor:pointer}

JQuery - 388/446 байт

W3C-совместимые браузеры (например, Chrome) - 388 байт

var t=c.getContext('2d');$.each('black0red0orange0yellow0green0blue0purple0clear'.split(0),function(k,v){
$(r).before($('<button>'+v+'</button>').click(function(){k>6?t.clearRect(0,0,600,400):t.strokeStyle=v}))})
$(c).mousedown(function(e){t.lineWidth=$(r).val();t.beginPath();t.moveTo(e.offsetX,e.offsetY)})
.mousemove(function(e){if(e.which==1){t.lineTo(e.offsetX,e.offsetY);t.stroke()}})

Кросс-браузерная версия (исправления для Firefox, Safari, IE) - 446 байт

var t=c.getContext('2d');$.each('black0red0orange0yellow0green0blue0purple0clear'.split(0),function(k,v){
$(r).before($('<button>'+v+'</button>').click(function(){k>6?t.clearRect(0,0,600,400):t.strokeStyle=v}))})
var d,p=$(c).offset();$(c).mousedown(function(e){d=t.lineWidth=$(r).val();t.beginPath()t.moveTo(e.pageX-p.left,
e.pageY-p.top)}).mousemove(function(e){if(d){t.lineTo(e.pageX-p.left,e.pageY-p.top);t.stroke()}}).mouseup(function(){d=0})

Исправления:

  • FireFox - event.offset[X|Y]не определены.
  • Safari - event.whichи event.buttonsне имеет смысла mousemove.
  • Internet Explorer - работает с обоими вышеперечисленными исправлениями, хотя использования e.buttonsбыло бы достаточно.

1
$ (документ). Уже в Codegolf?
edc65

вам не нужны кавычки id=и, возможно, другие тоже (давно не делал html)
Cyoce

10

Обработка - 93 · 0,9 = 83,7

Благодаря отсутствию накладных расходов на рисование, но очень многословному синтаксису, при обработке лучший результат, вероятно, достигается без каких-либо приятных функций и только одного бонуса:

void setup(){
size(600,400);
}
void draw(){
if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY);
}

Оценка: 93 · 0,9 = 83,7 (Новые строки предназначены только для удобства чтения и не учитываются в оценке.)

Тем не менее, все бонусы гораздо интереснее:

void setup(){
size(600,400);
}
int i,x,y;
void draw(){
stroke(7*i%256,5*i%256,i%256);
strokeWeight(i%9);
if(keyPressed)i++;
if(!mousePressed){x=mouseX;y=mouseY;if(x<0)background(0);}
}
void mouseReleased(){
line(x,y,mouseX,mouseY);
}

Оценка: 221 · 0,8 · 0,7 · 0,9 = 111,4

Используется так:

  • Нажмите и перетащите мышь, чтобы нарисовать прямую линию.

  • При нажатии перетащите мышь за левую часть окна и отпустите кнопку мыши, чтобы очистить экран.

  • Удерживая нажатой любую клавишу, можно переключаться между значениями красного, зеленого и синего цвета рисунка и различными значениями толщины мазка. Так как периоды езды на велосипеде различны, практически все комбинации могут быть достигнуты (с небольшим количеством попытки).

красочный выход 1

Редактировать:

Так как рисование от руки дает бонус 0,7, вот еще одно решение:

void setup(){
size(600,400);
}
int i;
void draw(){
stroke(7*i%256,5*i%256,i%256);
strokeWeight(i%9);
if(keyPressed)i++;
if(key>9)background(0);
if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY);
}

Оценка: 188 · 0,8 · 0,7 · 0,9 = 94,8

Используется так:

  • Нажмите и перетащите, чтобы нарисовать линии от руки.

  • Удерживайте клавишу Tab, чтобы изменить цвет и толщину обводки. Это также можно сделать во время рисования (см. Рисунок).

  • Нажмите любую клавишу, кроме вкладки, а затем вкладку, чтобы очистить экран.

красочный вывод 2


Freehand также дает вам бонус.
Caridorc

@Caridorc: Ах, отлично. Я обновлю свой ответ тогда.
Эмиль

2
Это будет трудно победить.
Примо

if(key>0)корочеif(keyPressed)
user41805

9

Python 2,7 - 339 197 324 * (0,7 * 0,8 * 0,9) = 163

Редактировать: я обнаружил, что Pygame может рисовать линии с переменной шириной, так что вот обновление.

Эксперимент по использованию модулей PyGame.

Простая программа рисования, которая рисует линии от события MOUSEDOWN (значение 5) до события MOUSEUP (значение 6). Он использует функцию pygame.gfxdraw.line (). Нажатие клавиши TAB будет переключаться между 8 цветами. Нажатие клавиши BACKSPACE очистит дисплей до тщательно обработанной бумаги белого цвета. Клавиша ENTER циклически изменяет размер кисти на 0-7 пикселей по ширине.

Я новичок в code-golf, поэтому, возможно, я пропустил некоторые методы уменьшения размера кода.

import pygame as A,pygame.draw as G
P=A.display
D=P.set_mode((600,400))
C=(0,255)
S=[(r,g,b) for r in C for g in C for b in C]
w=n=1
while n:
 e=A.event.wait()
 t=e.type
 if t==12:n=0
 if t==2:
  if e.key==9:n+=1
  if e.key==13:w+=1
  if e.key==8:D.fill(S[7])
 if t==5:p=e.pos
 if t==6:G.line(D,S[n%8],p,e.pos,w%8)
 P.flip()

Пример изображения 1:

Страшная картина самолета

Пример изображения 2:

Пейзаж


9
Теперь у меня есть файл на моем компьютере с именем ms-paint.py.
Примо

1
Наслаждайтесь скоростью и чистым графическим интерфейсом. Как MS-Paint должен был быть. Я надеюсь, что мне не предъявят иск некая крупная софтверная компания ...
Logic Knight,

5

C # 519 x 0,7 x 0,8 x 0,9 = 261,6 с использованием метода DrawLine.

Golfed:

using System;using System.Drawing;using System.Windows.Forms;class f:Form{[STAThread]static void Main(){f F=new f{Width=600,Height=400};Point s=default(Point);sbyte[]c={0,0,0,1};F.MouseDown+=(_,e)=>{s=new Point(e.X,e.Y);};F.MouseUp+=(_,e)=>{F.CreateGraphics().DrawLine(new Pen(Color.FromArgb(255,c[0],c[1],c[2]),c[3]),s.X,s.Y,e.X,e.Y);};F.KeyPress+=(a,e)=>{unchecked{switch(e.KeyChar){case'r':c[0]++;break;case'g':c[1]++;break;case'b':c[2]++;break;case't':c[3]++;break;case'c':F.Invalidate();break;}}};F.ShowDialog();}}

Удобочитаемый:

using System;
using System.Drawing;
using System.Windows.Forms;

class f : Form
{
    [STAThread]
    static void Main()
    {
        f F = new f { Width = 600, Height = 400 };
        Point s = default(Point);
        sbyte[] c = { 0, 0, 0, 1 };
        F.MouseDown += (_, e) => { s = new Point(e.X, e.Y); };
        F.MouseUp += (_, e) => { F.CreateGraphics().DrawLine(new Pen(Color.FromArgb(255, c[0], c[1], c[2]), c[3]), s.X, s.Y, e.X, e.Y); };
        F.KeyPress += (a, e) =>
        {
            unchecked
            {
                switch (e.KeyChar)
                {
                    case 'r': c[0]++; break;
                    case 'g': c[1]++; break;
                    case 'b': c[2]++; break;
                    case 't': c[3]++; break;
                    case 'c': F.Invalidate();break;
                }

            }
        };
        F.ShowDialog();
    }
}

Удерживая r , g или b на клавиатуре, он меняет цвет следующей строки, увеличивая массив sbyte по соответствующему индексу. Это начнется в 0 снова при переполнении. Так что это дает нам много цветов. То же самое касается толщины линии, которая увеличивается удерживанием t . Нажатие c очищает форму.


5

Mathematica - 333 х 0,7 х 0,8 х 0,9 = 168

l = {}; c = Black; s = .01;
ColorSetter@Dynamic@c
Dynamic@s~Slider~{0, .02}
Button["Clear", l = {}]
"/" Checkbox@Dynamic@b
EventHandler[
 Dynamic@Graphics@{White, Rectangle@{600, 400}, l},
 {"MouseDown" :> 
   AppendTo[l, p = {}; {c, Thickness@s, Line@Dynamic@p}], 
  "MouseDragged" :> (p = 
     Append[p, MousePosition@"Graphics"][[If[b, {1, -1}, All]]]),
  "MouseUp" :> (l[[-1, 3]] = Line@p)
  }
 ]

введите описание изображения здесь


Может ли это рисовать линии от точки к точке? По-видимому, разрешено только рисование от руки.
трихоплакс

@ githubphagocyte Да, свободная рука только в данный момент.
swish

1
@githubphagocyte Добавлена ​​опция прямой линии
swish

лучший ответ на данный момент.
Примо

Хотя я люблю рисовать.
Томсминг

4

Tcl / Tk, 252

х 0,8 х 0,7 х 0,9

= 127,008

253 х 0,8 х 0,7 х 0,9 = 127 512

254 х 0,8 х 0,7 х 0,9 = 128,016

255 х 0,8 х 0,7 х 0,9 = 128,52

grid [canvas .c -w 600 -he 400]
set c red
incr t
lmap k {1
B1-Motion
3
MouseWheel
2} s {{set L [.c cr l %x %y %x %y -f $c -w $t]}
{.c coo $L "[.c coo $L] %x %y"}
{set c [tk_chooseColor]}
{if $t|%D>0 {incr t [expr %D/120]}}
{.c de all}} {bind . <$k> $s}

Tcl / Tk, 267

х 0,8 х 0,7 х 0,9

= 134,568

grid [canvas .c -w 600 -he 400]
set c red
set t 0
bind .c <1> {set L [.c cr l %x %y %x %y -f $c -w $t]}
bind .c <B1-Motion> {.c coo $L "[.c coo $L] %x %y"}
bind .c <3> {set c [tk_chooseColor]}
bind .c <MouseWheel> {if $t||%D>0 {incr t [expr %D/120]}}
bind .c <2> {.c de all}

Чтобы использовать это:

  • Левая кнопка мыши ведет себя как запрос вопросов
  • Начальный цвет красный. Правая мышь показывает диалог, который позволяет пользователю выбрать цвет, который будет использоваться в следующий раз. Всегда нажимайте кнопку ОК, иначе цвет будет неопределенным. Я мог бы это исправить, но это будет потреблять байты
  • Чтобы отрегулировать толщину линии, которая будет использоваться в следующий раз, вы можете вращать колесико мыши: вверх = толще, вниз = тоньше
  • Чтобы очистить изображение, нажмите среднюю кнопку мыши

Простой тест:

введите описание изображения здесь


2

DarkBASIC Pro - 318 х 0,7 х 0,9 = 200,34

Самое интересное здесь - это использовать побитовую логику текущего скан-кода клавиатуры для изменения цвета. Я использую два разных бита из кода сканирования для каждого канала - так что возможен почти любой 6-битный цвет.

  • Удерживайте нажатой любую клавишу на клавиатуре, чтобы использовать цвет (на моей американской клавиатуре: белый = F5, черный = нет клавиши, красный = 2, зеленый = - (минус), синий = b)
  • Щелкните правой кнопкой мыши, чтобы очистить

Вот скомпилированный EXE: Скачать

#constant a set current bitmap
set display mode 800,400,32
create bitmap 1,800,400
do
s=scancode()
ink rgb((s&&3)*85,((s/4)&&3)*85,((s>>4)&&3)*85),0
m=mousex()
n=mousey()
o=mouseclick()
if o*(d=0) then d=1:x=m:y=n
a 1
if (o=0)*d then d=0:line x,y,m,n
if o=2 then cls
a 0
cls
copy bitmap 1,0
if d then line x,y,m,n
loop

1

BBC BASIC - 141 без бонусов

Мой первый язык программирования и, как правило, больше не используется мной :)

SYS "SetWindowPos",@hwnd%,0,0,0,600,400,6:VDU 26
1 MOUSE X,Y,b
IF b=4 THEN GOTO 4
GOTO 1
4 MOUSE x,y,b
IF b=0 THEN LINE X,Y,x,y:GOTO 1
GOTO 4

1

Python 2.7 - 384 * .8 * .7 = 215.04

from Tkinter import*;o=1
a='0f';C=['#'+r+g+b for r in a for g in a for b in a]
def i(a):global o;o+=1
def d(a):global o;o-=1
def I(a):global u;u+=1
def D(a):global u;u-=1
m=Tk();u=0;c=Canvas(width=600,height=400);c.bind("<B1-Motion>",lambda x:c.create_rectangle((x.x,x.y,x.x+o,x.y+o),fill=C[u],outline=C[u]));m.bind("q",i);m.bind("w",d);m.bind("x",D);m.bind("z",I);c.pack();mainloop()

Со всеми бонусами: 462 * .9 * .8 * .7 = 232,848

from Tkinter import*;o=1
a='0f';C=['#'+r+g+b for r in a for g in a for b in a]
def i(a):global o;o+=1
def d(a):global o;o-=1
def I(a):global u;u+=1
def D(a):global u;u-=1
m=Tk();u=0;c=Canvas(width=600,height=400);c.bind("<B1-Motion>",lambda x:c.create_rectangle((x.x,x.y,x.x+o,x.y+o),fill=C[u],outline=C[u]));m.bind("q",i);m.bind("w",d);m.bind("x",D);m.bind("z",I);m.bind("m",lambda _:c.create_rectangle((0,0,602,402),fill=C[7],outline=C[5]));c.pack();mainloop()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.