रंगीन रेखांकन


9

कुछ मामलों में, अक्सर भौतिकी में, आपको रेखांकन करना होगा। आपकी चुनौती यह है कि अपनी पसंद की भाषा में, एक प्रोग्राम या फ़ंक्शन जो छवियों के रूप में कई ग्राफ़ लेता है, सभी संभावित योगों की गणना करता है, और परिणाम को आउटपुट करता है।

रेखांकन

रेखांकन वे चित्र हैं जिनमें rgb(255, 255, 255)प्रत्येक कॉलम में एक गैर-सफेद पिक्सेल के साथ एक सफेद ( ) पृष्ठभूमि होती है। उदाहरण:

उदाहरण ग्राफ उदाहरण ग्राफ उदाहरण ग्राफ

स्क्रिप्ट के मूल्यों को रंगीन पिक्सल्स के Y पदों के रूप में दर्शाया गया है। एक निश्चित X निर्देशांक पर मान उस कॉलम में ऊपरवाले रंगीन पिक्सेल की Y स्थिति के बराबर होता है, जिसमें नीचे बाईं ओर 0 से शुरू होने वाले निर्देशांक होते हैं। सौंदर्यपरक कारणों से उन पिक्सेल के नीचे अतिरिक्त रंगीन पिक्सेल नहीं हो सकते हैं या नहीं हो सकते हैं।

कार्य

आपका कार्य आपकी पसंद की भाषा में, एक प्रोग्राम या फ़ंक्शन लिखना है जो कई ग्राफ़ को छवियों के रूप में लेता है, सभी संभावित 2^n - 1योगों की गणना करता है , और परिणाम को आउटपुट करता है।

रेखांकन का योग एक ग्राफ होता है, जहां प्रत्येक कॉलम का मान इनपुट ग्राफ के प्रत्येक कॉलम में संबंधित कॉलम के मान के बराबर होता है।

रेखांकन कई रंगों में आएगा। परिणाम चित्र में मूल ग्राफ़ सहित अन्य ग्राफ़ के रूप में ग्राफ़ के सभी संभावित योग शामिल होने चाहिए, लेकिन शून्य राशि को छोड़कर।

प्रत्येक राशि का रंग रेखांकन के रंगों के औसत द्वारा निर्धारित किया जाता है, उदाहरण के लिए, रंगों का रेखांकन rgb(255, 0, 255)और rgb(0, 255, 255)एक ग्राफ का उत्पादन करेगा rgb(128, 128, 255)(नीचे भी गोल किया जा सकता है)।

परिणामी छवि सभी ग्राफ़ को फिट करने के लिए जितनी आवश्यक हो उतनी उच्च होनी चाहिए। इसका मतलब है कि आपको किसी भी इनपुट से बड़ी छवि को आउटपुट करना पड़ सकता है।

वह क्रम जिसमें परिणामी रेखांकन परिणामी छवि के लिए तैयार किए जाते हैं, कोई फर्क नहीं पड़ता है, अर्थात यदि परिणाम ग्राफ़ ओवरलैप होता है, तो आप चुन सकते हैं कि कौन सा शीर्ष पर है, लेकिन इसे ग्राफ़ में से एक होना चाहिए, न कि उनके रंगों का संयोजन।

आप मान सकते हैं कि इनपुट छवियां समान चौड़ाई की हैं, कि सभी छवियों के कॉलम में कम से कम एक गैर-सफेद पिक्सेल है, और यह कि छवियों की ऊँचाई (आउटपुट सहित) 4096 पिक्सेल से नीचे है।

उदाहरण

इनपुट A:

उदाहरण ग्राफ a

इनपुट बी:

उदाहरण ग्राफ b

उदाहरण आउटपुट:

उदाहरण ग्राफ योग

(यदि कोई दिलचस्पी रखता है, तो मैंने यादृच्छिक कंपनियों के स्टॉक चार्ट से इन के लिए डेटा को कॉपी-पेस्ट किया। यह पहला तरीका था, जिसमें मुझे CSV के रूप में यथार्थवादी डेटा मिला था।)

नियम

  • आप किसी भी बिटमैप छवि इनपुट फ़ाइल प्रारूप का चयन कर सकते हैं।
  • आप किसी भी बिटमैप छवि आउटपुट फ़ाइल प्रारूप को चुन सकते हैं, जिसे इनपुट से मेल नहीं खाना है।
  • आप छवि प्रसंस्करण पुस्तकालयों का उपयोग कर सकते हैं, हालांकि इस कार्य को सीधे पूरा करने के लिए कोई भी कार्य प्रतिबंधित हैं।
  • मानक खामियां लागू होती हैं।
  • ये है , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।

ग्राफ जनरेटर स्क्रिप्ट

यहाँ एक पायथन 2 स्क्रिप्ट है जो रेखांकन उत्पन्न करती है। इनपुट लाइनों में दिया जाता है, तीन पहली पंक्तियों के साथ आरजीबी रंग और बाकी डेटा के रूप में, ईओएफ द्वारा समाप्त।

import PIL.Image as image
import sys

if len(sys.argv) < 2:
    sys.stderr.write("Usage: graphgen.py <outfile> [infile]")
    exit(1)
outfile = sys.argv[1]
if len(sys.argv) > 2:
    try:
        stream = open(sys.argv[2], "r")
        data = stream.read()
        stream.close()
    except IOError as err:
        if err.errno == 2:
            sys.stderr.write("File \"{0}\" not found".format(sys.argv[2]))
        else:
            sys.stderr.write("IO error {0}: {1}".format(err.errno, err.strerror))
        exit(1)
else:
    data = sys.stdin.read()

try:
    items = map(int, data.strip().split("\n"))
    red, green, blue = items[:3]
    items = items[3:]
    highest = max(items)
except (ValueError, TypeError, IndexError):
    sys.stderr.write("Invalid value(s) in input")

img = image.new("RGB", (len(items), highest + 1), (255, 255, 255))

prev = items[0]
img.putpixel((0, highest - items[0]), (red, green, blue))
for x, item in enumerate(items[1:]):
    img.putpixel((x + 1, highest - item), (red, green, blue))
    if item < prev:
        for i in range(item + 1, prev):
            img.putpixel((x, highest - i), (red, green, blue))
    else:
        for i in range(prev + 1, item):
            img.putpixel((x + 1, highest - i), (red, green, blue))
    prev = item

img.save(outfile, "png")

@ मार्टिनबटनर मैं वर्तमान में दो ग्राफ़ के लिए एक बना रहा हूं। मैं इसे हाथ से कर रहा हूं (अभी तक कोई संदर्भ नहीं मिला है), इसलिए मुझे नहीं पता कि मेरे पास धैर्य है 3. इसके अलावा, मैंने जो तीन दिए हैं, उन्हें समन नहीं किया जा सकता क्योंकि वे अलग-अलग चौड़ाई के हैं।
पुरकाकूदरी

इसलिए यदि nइनपुट ग्राफ हैं, 2^n - 1तो आउटपुट इमेज में लाइनें होंगी ?
पीटर टेलर

@PeterTaylor हाँ।
पुरकाकूदरी

मुझे लगता है यह उत्पादन वास्तव में किसी भी ऊर्ध्वाधर लाइनों को शामिल करने की जरूरत नहीं है? प्रत्येक कॉलम में केवल सबसे शीर्ष पिक्सेल?
मार्टिन एंडर

@ मार्टिनबटनर यह सही है, क्योंकि उस डेटा को अभी भी एक ग्राफ के रूप में पहले खंड में परिभाषित किया जा सकता है।
पुरकाकूदरी

जवाबों:


3

MATLAB, 405

इसके माध्यम से कॉल करें: f('http://i.stack.imgur.com/ffCzR.png','http://i.stack.imgur.com/zHldg.png')

function f(varargin)
for k=1:nargin
i=im2double(imread(varargin{k}))
V(k,:)=size(i,1)-cellfun(@(V)find(any(V~=1,3),1),num2cell(i,[1,3]))
C(k,:)=i(find(any(i(:,1,:)~=1,3),1),1,:)
end
s=2^nargin-1
G=dec2bin(1:s)-'0'
C=bsxfun(@rdivide,G*C,sum(G,2))
V=G*V
m=max(V(:))
r=ones(m+1,size(V,2))
g=r
b=r
for i=1:s
M=bsxfun(@eq,(m:-1:0).',V(i,:))
r(M)=C(i,1)
g(M)=C(i,2)
b(M)=C(i,3)
end
imwrite(cat(3,r,g,b),'S.png')

4

अजगर, 422

कमांडलाइन से कॉल करें python plotsum im1.png im2.png im3.png

import sys
from numpy import*
from scipy import misc as m
R=m.imread
r=range
a=array
N=sys.args[1:]
L=len(N)
P=[map(argmin,R(n,1).T)for n in N]               #converts image to list of heights, counting from the top
C=a([R(N[i])[P[i][0],0,:]for i in r(L)])         #finds and stores the colour
P=a([len(R(N[i]))-a(P[i])for i in r(L)])         #flips the numbers, measures actual heights from bottom
w=len(P[0])
h=max(sum(P,0))+1                                    #compute dimensions
G=ones((h,w,3))*255                                  #and make a white grid
for i in r(1,2**L):
 z=where(a(list(bin(i)[2:].zfill(L)))=='1');y=sum(P[z],0)    #sum the graphs
 for x in r(w):G[y[x],x,:]=average(C[z],0)                   #average the colours
m.imsave('S.png',G[::-1])                            #flip image vertically and save

उदाहरण आउटपुट
यहां छवि विवरण दर्ज करें
एक और उदाहरण
यहां छवि विवरण दर्ज करें

यह एक मुश्किल था, उच्च-स्तरीय सरणी संचालन और सूचकांकों के रूप में सरणियों का उपयोग करना यहां बहुत मदद करता है। मुझे Mathematica और Matlab को छोड़कर 1000 बाइट्स के तहत समाधान देखने की उम्मीद नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.