Коротка програма малювання


13

Ви щойно запросили майора з гуманітарних мистецтв до свого будинку і ви йому / їй розповідаєте

"Ви знаєте, я чудовий програміст і можу робити х і у і з ..."

S / він швидко набридає і просить вас:

"Якщо ви справді чудовий програміст, чи можете ви створити програму, яка дозволить мені малювати, мені просто потрібно намалювати лінії на екрані за допомогою миші та будь-яким чином вибрати різні кольори".

Ваш код може імпортувати стандартні бібліотеки. Ваш код може вимагати вибору кольорів за допомогою клавіатури.

Це ; виграє найкоротший код.

Кульові очки

  • Лінії малюються переміщенням миші, натискаючи ліву кнопку.

  • Лінійний алгоритм Брезенама не потрібен, будь-який вбудований алгоритм зробить свою справу

  • Якщо користувач може будь-яким чином змінити товщину лінії, ви отримаєте бонус * 0,8, але це не обов'язково.

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

  • Мінімум - 5 різних кольорів (червоний, зелений, синій, білий, чорний). Якщо ви змусите їх змінюватися випадковим чином, ви отримуєте штраф * 1,2. Ви можете змінити їх будь-яким способом (вам потрібні і кнопки, і натискання клавіш).

  • Намалювати їх, натискаючи мишею між пунктами або від руки, було б найкраще (наприклад, як це робиш у фарбі) і дає бонус * 0,7, але будь-який інший спосіб добре: (наприклад) клацніть дві точки та проведіть лінію між цими точками ?

  • Полотно для малювання має бути 600x400

  • Зміна кольору повинна змінити колір лише тих ліній, які будуть намальовані в майбутньому.

  • Реалізація команди "Очистити всіх" не є обов'язковою, але якщо ви реалізуєте, ви отримуєте * 0,9 бонуса.


2
Як потрібно малювати лінії? Алгоритм лінії Брезенама ? Чи повинні лінії бути різної товщини? Чи потрібно нам самостійно реалізовувати малювання ліній? Будь ласка, вкажіть більше. І зазвичай передбачається, що наш код може "імпортувати стандартні бібліотеки". Скільки кольорів потрібно вибрати? 2 добре? А як щодо випадкового вибору кольору кожного разу, коли натискається кнопка клавіатури?
Джастін

2
Потрібно ще кілька уточнень: Як малюються лінії? Ви натискаєте дві точки і проводите лінію між цими точками? Наскільки великим має бути полотно для малювання? Скільки кольорів потрібно підтримувати? Чи може зміна кольору також змінити колір кожної іншої лінії? В даний час цей виклик в даний час дуже не визначений.
Дверна ручка

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

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

2
1. "Намалювати їх, натискаючи мишкою між двома точками, найкраще, але будь-який інший спосіб - це нормально" Що з малюванням від руки, як за допомогою інструмента олівцем у фарбі? Я пропоную вам зробити це зрозумілішим або взагалі усунути "будь-який інший метод". 2. Метод зміни кольору повинен бути уточнений краще. Наприклад, чи можна це зробити за допомогою клавіатури, обертаючи кольори за допомогою іншої кнопки миші, чи це потрібно, клацнувши на екрані палітри?
Річка Рівня Св.

Відповіді:


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]не визначені.
  • Сафарі - 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

Він використовується так:

  • Клацніть та перетягніть, щоб намалювати вільні лінії.

  • Утримуйте клавішу вкладки, щоб змінити колір і товщину обведення. Це також можна зробити під час малювання (див. Малюнок).

  • Натисніть будь-яку клавішу, крім вкладки, а потім на вкладку, щоб очистити екран.

барвистий вихід 2


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

@Caridorc: Ах, чудово. Я тоді оновлю свою відповідь.
Еміль

2
Це буде важко перемогти.
прим

if(key>0)коротше, ніжif(keyPressed)
user41805

9

Пітон 2,7 - 339 197 324 * (0,7 * 0,8 * 0,9) = 163

Редагувати: я виявив, що пігама може малювати лінії зі змінною шириною, ось ось оновлення.

Експеримент із використанням модулів PyGame.

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

Я новачок у коді-гольф, тому, можливо, я пропустив деякі методи зменшення розміру коду.

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.

Гольф:

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

Математика - 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 Так, вільна рука тільки на даний момент.
швейцарський

1
@githubphagocyte Додано варіант прямої лінії
swish

найкраща відповідь поки що.
прим

Хоча я люблю малюнок.
tomsmeding

4

Tcl / Tk, 252

x 0,8 x 0,7 x 0,9

= 127,008

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

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

255 x 0,8 x 0,7 x 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

x 0,8 x 0,7 x 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 x 0,7 x 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

Пітон 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.