Kısa çizim programı


13

Evinize büyük bir liberal sanat davet ettiniz ve ona söylüyorsunuz

"Biliyorsun, ben harika bir programcıyım ve x, y ve z yapabilirim ..."

Hızla sıkılır ve size sorar:

"Gerçekten harika bir programcıysanız, çizmeme izin verecek bir program yapabilir misiniz, sadece fareyi kullanarak ve herhangi bir şekilde farklı renkler seçerek ekranda çizgiler çizmem gerekiyor".

Kodunuz standart kitaplıkları içe aktarabilir. Kodunuz renklerin klavye ile seçilmesini gerektirebilir.

Bu ; en kısa kod kazanır.

Madde işaretleri

  • Sol düğmeye basarken fareyi hareket ettirerek çizgiler çizilir.

  • Bresenham'ın Line Algoritması gerekli değildir.

  • Kullanıcı çizgi kalınlığını herhangi bir şekilde değiştirebilirse * 0,8 bonus alırsınız ancak zorunlu değildir.

  • Sanırım çizgi çizimi kendimiz uygulamak daha güzel olmalı, ama isterseniz bir kütüphane ithal edebilirsiniz sadece kod açıklamasında söyleyin.

  • Minimum 5 farklı renktir (kırmızı, yeşil, mavi, beyaz, siyah). Eğer onları rastgele değiştirirseniz * 1.2 ceza alırsınız. Bunları istediğiniz şekilde değiştirebilirsiniz (hem düğmeler hem de tuşa basma tamam).

  • Fareyi noktalara veya serbest ellere bastırarak çizmek en iyisidir (yani boyada yaptığınız gibi) ve size * 0.7 bonusu verir, ancak diğer herhangi bir yöntem uygundur: (örnek) iki noktayı tıklayın ve bu noktalar arasında bir çizgi çizin ?

  • Çizim tuvali 600x400 olmalıdır

  • Rengi değiştirmek, yalnızca ileride çizilecek çizgilerin rengini değiştirmelidir.

  • Bir "Tümünü Temizle" komutu uygulamak zorunlu değildir, ancak bunu uygularsanız * 0.9 bonus kazanırsınız.


2
Çizgilerin çizilmesi nasıl gerekir? Bresenham'ın Çizgi Algoritması ? Çizgilerin değişken kalınlıkta olması gerekiyor mu? Çizgi çizmeyi kendimiz mi uygulamalıyız? Lütfen daha fazla belirtin. Normalde kodumuzun "standart kütüphaneleri içe aktarabileceği" varsayılır. Kaç renk seçilebilir olmalı? 2 iyi mi? Veya bir klavye düğmesine her basıldığında rastgele renk seçmeye ne dersiniz?
Justin

2
Daha fazla açıklama gerekiyor: Çizgiler nasıl çizilir? İki noktayı tıklatıp bu noktalar arasında çizgi çiziyor musunuz? Çizim tuvali ne kadar büyük olmalı? Kaç renk desteklenmelidir? Rengi değiştirmek diğer çizgilerin rengini de değiştirebilir mi? Vb Bu zorluk şu anda çok az belirtilmiştir.
Kapı tokmağı

@ Quincunx Soruya bir soru-cevap koydum, şimdi iyi olup olmadığını söyle.
Caridorc

2
1. Lütfen Soru ve Cevapları yoğunlaştırın. Soruları ortadan kaldırın ve Cevapları mermi noktaları olarak kendi başlarına tutun. Yorumların bazen silinebileceğini unutmayın. Bresenham'ın Algoritma Noktası, yorumu okumadan hiçbir anlam ifade etmiyor. Söylediğinizi varsayalım, Bresenham'ın algoritması gerekli değildir ve herhangi bir algoritma veya standart / kütüphane işlevi yapacak. 2. Sonuçta kazanmak, hangi dilde API'ya girmenin ve Sağ düğmeye (her zamanki sol düğme yerine) erişmenin kolay olduğuna bağlıdır.
Level River St

2
1. "Onları 2 nokta arasında fareye basarak çizmek en iyisidir, ancak başka herhangi bir yöntem yolundadır." Boya kalem aracıyla nasıl serbest çizim yapmaya ne dersiniz? Bunu daha net yapmanızı veya "diğer yöntemlerin tamam olduğunu" tamamen ortadan kaldırmanızı öneririm. 2. Renk değiştirme yöntemi daha iyi belirtilmelidir. Örneğin, diğer fare düğmesiyle renkler arasında döndürülerek klavyeden yapılabilir mi, yoksa ekran paletini tıklatarak mı yapılması gerekiyor?
Level River St

Yanıtlar:


9

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

Düşündüğüm kadar kısa değil, ama sonucu beğendim.

Özellikleri:

  • Tıklama ve sürükleme çizim modu. ( 0.7 )
  • Yedi renk (siyah + gökkuşağı).
  • Değişken fırça genişliği (sürgü kontrolü). ( 0.8 )
  • Tüm işlevi temizle. ( 0.9 )

Canlı Demo: http://jsfiddle.net/onsLkh8y/9/


HTML - 84 bayt

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

CSS - 35 bayt

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

jQuery - 388/446 bayt

W3C uyumlu tarayıcılar (ör. Chrome) - 388 bayt

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()}})

Çapraz Tarayıcı sürümü (Firefox, Safari, IE için düzeltmeler) - 446 bayt

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})

Düzeltmeler:

  • FireFox - event.offset[X|Y]tanımsız.
  • Safari - event.whichve event.buttonsüzerinde anlamlı bir şekilde tanımlanmamıştır mousemove.
  • Internet Explorer - kullanımı e.buttonsyeterli olsa da, yukarıdaki düzeltmelerin her ikisiyle de çalışır .

1
$ (belge). zaten codegolf mu?
edc65

id=ve belki de diğerleri için tırnak gerekmez (bir süredir html yapmadım)
Cyoce

10

İşleme - 93 · 0.9 = 83.7

Çizim için ek yük yok, ancak çok ayrıntılı bir sözdizimi ile İşleme'de en iyi puana muhtemelen herhangi bir güzel özellik ve sadece bir bonus olmadan ulaşılıyor:

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

Puan: 93 · 0.9 = 83.7 (Yeni satırlar yalnızca okunabilirlik içindir ve puanda sayılmaz.)

Ancak, tüm bonuslar yerinde olduğunda çok daha eğlenceli:

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);
}

Puan: 221 · 0.8 · 0.7 · 0.9 = 111.4

Bu şekilde kullanılır:

  • Düz bir çizgi çizmek için fareye tıklayın ve sürükleyin.

  • Tıklatıldığında, fareyi pencerenin sol tarafından sürükleyin ve ekranı temizlemek için fare düğmesini serbest bırakın.

  • Herhangi bir tuşa basıldığında, çizim renginin kırmızı, yeşil ve mavi değerleri ile farklı kontur kalınlıkları arasında geçiş yapılır. Bisiklet süreleri farklı olduğundan, pratik olarak tüm kombinasyonlara ulaşılabilir (biraz denemeyle).

renkli çıktı 1

Düzenle:

Serbest çizim 0,7 bonus da verdiğinden, işte başka bir çözüm daha var:

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);
}

Puan: 188 · 0.8 · 0.7 · 0.9 = 94.8

Bu şekilde kullanılır:

  • Serbest çizgiler çizmek için tıklayın ve sürükleyin.

  • Renk ve kontur kalınlığını değiştirmek için sekme tuşunu basılı tutun. Bu, çizim sırasında da yapılabilir (resme bakın).

  • Ekranı temizlemek için herhangi bir tuşa ve ardından sekmesine basın.

renkli çıktı 2


Freehand ayrıca size bonus verir.
Caridorc

@Caridorc: Ah, harika. O zaman cevabımı güncelleyeceğim.
Emil

2
Yenmek zor olacak.
primo

if(key>0)daha kısadırif(keyPressed)
user41805

9

Python 2.7-- 339 197 324 * (0.7 * 0.8 * 0.9) 163 =

Düzenleme: Pygame değişken genişlikte çizgiler çizebilirsiniz keşfetti, bu yüzden burada bir güncelleme.

PyGame modüllerini kullanma denemesi.

MOUSEDOWN olayından (değer 5) MOUSEUP olayına (değer 6) çizgiler çizen basit bir boya programı. Pygame.gfxdraw.line () işlevini kullanır. SEKME tuşuna basıldığında 8 renk arasında geçiş yapılır. BACKSPACE tuşuna basmak, ekranı dikkatlice hazırlanmış beyaz kağıt rengine getirecektir. ENTER tuşu, fırça boyutunu 0-7 piksel genişliğinde döndürür.

Ben kod boyutunu azaltmak için bazı yöntemleri kaçırmış olabilir bu yüzden kod golf yeni.

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()

Örnek resim 1:

Bir uçağın korkunç resim

Örnek resim 2:

peyzaj


9
Bilgisayarımda artık adlı bir dosya var ms-paint.py.
primo

1
Hızın ve temiz GUI'nin tadını çıkarın. MS-Paint'in nasıl olması gerektiği. Umarım büyük bir yazılım şirketi tarafından dava
Logic Knight

5

C # 519 x 0,7 x 0,8 x 0,9 = 261,6 DrawLine yöntemini kullanarak.

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();}}

Okunabilir:

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();
    }
}

Klavyenizdeki r , g veya b tuşunu basılı tutarak , ilgili dizindeki bir sbyte dizisini artırarak bir sonraki satırın rengini değiştirir. Taşma sırasında tekrar 0'dan başlayacaktır. Bu bize bol renk veriyor. Aynı şey t ile arttırılan çizginin kalınlığı için de geçerlidir . C tuşuna basıldığında form temizlenir.


5

Mathematica - 333 x 0,7 x 0,8 x 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)
  }
 ]

resim açıklamasını buraya girin


Bu noktadan noktaya çizgiler çizebilir mi? Sadece serbest el çizimine izin verdiği görülüyor.
trichoplax

@githubphagocyte Evet, şu anda serbest el.
swish

1
@githubphagocyte Düz çizgi seçeneği eklendi
swish

Şimdiye kadarki en iyi cevap.
primo

Yine de çizimi seviyorum.
Kasım'da 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}

Kullanmak için:

  • Sol fare düğmesi soru istekleri gibi davranır
  • İlk renk kırmızıdır. Sağ fare kullanıcının bir dahaki sefere kullanılacak rengi seçmesini sağlayan bir iletişim kutusu görüntüler. Her zaman OK düğmesine basın, aksi takdirde renk tanımlanmayacaktır. Bunu düzeltebilirdim, ama bayt tüketirdi
  • Bir dahaki sefere kullanılacak çizginin kalınlığını ayarlamak için fare tekerleğini döndürebilirsiniz: Yukarı = daha kalın, Aşağı = daha ince
  • Görüntüyü temizlemek için farenin orta düğmesine basın

Basit bir test:

resim açıklamasını buraya girin


2

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

Buradaki en ilginç şey, rengi değiştirmek için mevcut klavye tarama kodunda bitsel bir mantık kullanmaktır. Her kanal için tarama kodundan iki farklı bit kullanıyorum - bu yüzden hemen hemen her 6 bit renk mümkün.

  • Bir renk kullanmak için klavyenizdeki herhangi bir tuşu basılı tutun (Amerikan klavyemde: Beyaz = F5, Siyah = tuş yok, Kırmızı = 2, Yeşil = - (eksi), Mavi = b)
  • Temizlemek için sağ tıklayın

İşte derlenmiş bir EXE: İndir

#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 bonus yok

İlk programlama dilim ve genellikle artık benim tarafımdan kullanılmadı :)

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()

Tüm bonuslarla: 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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.