如何用簡單的演算法生成一個類似『光碟』的彩色圓形圖片?

大概就像下圖所示的樣子


補充一下MATLAB的代碼:

t = (0:.02:2)*pi;
r = 0:.02:1;
pcolor(cos(t)"*r,sin(t)"*r,t"*(r==r))
colormap(hsv(256)), shading interp, axis image off

補充一下,如果不顯式生成數據也是可以的,用ezsurf:

ezsurf("r*cos(t)","r*sin(t)","t",[0 1 0 2*pi])
colormap(hsv(256)),shading interp,view(2), axis image off

不過ezsurf這種比較黑箱的東西也就測試的時候畫畫圖用,追求性能要畫很多圖的最好還是自己生成數據
受 R 語言的答案啟發,用 pie 也可以:

pie(ones(360,1),repelem({""},360))
colormap(circshift(hsv(360),-90)), shading interp


LaTeX大法好

documentclass{article}
usepackage{xcolor}
usepackage{tikz}

defd{1}
def
{5}

ewcommand{sector}[3]{
definecolor{tempColor}{Hsb}{#3,1,1}
fill[tempColor](0,0) -- +(#1:
) arc(#1:#2:
) -- cycle;
}

egin{document}
centering
egin{tikzpicture}
count0=0loopifnumcount0&<360 sector{ hecount0}{ he umexprd+count0}{ he umexprcount0} advancecount0 by d epeat end{tikzpicture} end{document}

是很多小扇形堆起來的,其中
是半徑,d是每個小扇形的角度

把d設置成18後就是這個樣子。。。

------

21:10-02-20-2017 補充

好像一些人不知道LaTeX強大的畫圖能力,那麼。。。

參見 shareLaTeX的pgfplots介紹:Pgfplots package

------

20:22-05-25-2017 補充

才知道有個逆天的pstricks

http://ctan.mackichan.com/graphics/pstricks/contrib/pst-solides3d/doc/pst-solides3d-doc.pdf

不過不是很了解Orz


補充一下Mathematica代碼

ImageAdd[Colorize[Image@Rescale@Array[ArcTan,2#,.00001-#][200{1,1}],
ColorFunction-&>Hue],Graphics@Disk[]]


R語言的簡單版本

pie(rep(1,1000), col=rainbow(1000),label=NA,border=NA)

另外R語言還有很多配置好的調色板哦
比如

pie(rep(1,n), col=heat.colors(n),label=NA,border=NA)


Mathematica

Graphics[Table[{Hue[t], Disk[{0, 0}, 1, {2π t, 2π}]}, {t, 0, 1, .001}]]


→_→,渣演算法,求輕噴
使用python的turtle庫完成繪製

#coding:utf-8

import turtle

circleR = 100
R = 255
G = 0
B = 0
Y = 0
allValues = 255 * 6
steps = 720
interval = allValues / steps

turtle.colormode(255)
t = turtle.Turtle()
t.hideturtle()
t.up()
t.setx(circleR)
t.down
turtle.tracer(100, 0)
t.pensize(2)
t.pencolor((R, G, B))

for i in range(steps):
t.setheading(360 / steps * i)
# t.circle(i+circleR, 180)
t.forward(100)
if i &< (steps / 6): G += interval elif i &< (2 * steps / 6): R -= interval elif i &< (3 * steps / 6): B += interval elif i &< (4 * steps / 6): G -= interval elif i &< (5 * steps / 6): R += interval elif i &< (6 * steps / 6): B -= interval if G &> 255:
G = 255
if R &> 255:
R = 255
if B &> 255:
B = 255
if G &< 0: G = 0 if R &< 0: R = 0 if B &< 0: B = 0 t.pencolor((int(R), int(G), int(B))) t.up() t.setx(0) t.sety(0) t.down() print(t.pencolor()) turtle.done()

2016-06-08 08:04 更新啦

---------------------------------------分割線------------------------------------------------
在這裡說一下,我在上蕭大 @蕭井陌 的python基礎班。當時是看見蕭大在群里發了這個問題的連接我就點進來看了,這之前我已經完成了一個色彩漸變的方塊,開始看見這題的時候還沒什麼思路,後來仔細想想。。卧槽??!!我把方塊變成圓的不就完了→_→。機智如我。

這裡我看見評論有同學看不懂,需要解釋一下。那我來說一下吧。
其實這個只需要一些關於顏色的基礎知識,這個程序中我用的RGB顏色(貌似只能用RGB顏色)。所謂的RGB呢,就是通過R(紅)、G(綠)、B(藍)三種顏色的疊加來實現各種顏色。在turtle這個庫中設置顏色有兩種模式:colormode(1)和colormode(255),第一種模式顏色值是在[0 - 1]之間的小數,第二種模式顏色值是在[0 - 255]之間的整數,在這裡我是用的colormode(255)因為方便計算。
計算方法:
在這裡我是先觀察了一個RGB顏色選擇器RGB網頁顏色在線取色器,亮度我們不用管,所以我參考了最上面一排的標準顏色,查看這一排的顏色值的變化規律,然後發現它們的顏色值是這麼變化的:純紅(R:FF,G:00,B:00),綠色逐漸增加(G↑)至(R:FF,G:FF,B:00),紅色逐漸減小(R↓)至(R:00,G:FF,B:00),藍色逐漸增加(B↑)至(R:00,G:FF,B:FF),綠色逐漸減小(G↓)至(R:00,G:00,B:FF),紅色逐漸增加(R↑)至(R:FF,G:00,B:FF),藍色逐漸減小(B↓)至(R:FF,G:00,B:00)。這樣就完成了一個循環。這一共是6步。因為光碟的顏色只與角度關(同一個角度上的所有點顏色相同),所以呢,只需要在不同角度上畫不同顏色的直線就行了,顏色的變化規律就按照剛才找到的規律來。


改編自@馮昱堯的代碼

from pylab import *
n=300
img=[[arctan2(x,y) if x*x+y*y&


...被搶先了...

基本上就是在這個圓上顏色的色相(Hue),只與該點與圓心連線的夾角有關。知道這一點你就做一幅圖像,然後遍歷每一個點,把該點的坐標值(x,y)轉換為極坐標(r,	heta ),色相值就是極坐標角度	heta /2pi

用 matplotlib 實現的話有個小技巧,把imshow的cmap改為hsv就可以直接按照色相來畫。

# -*- coding:utf-8 -*-
from pylab import *

center = (250, 250)
radius = 250

img = zeros((500,500))

for i in range(500):
for j in range(500):
x = i - center[0] * 1.0
y = j - center[1] * 1.0
if x**2+y**2 &< radius**2: if x &> 0:
img[i,j] = arctan(y/x)
elif x&<0 and y&>=0:
img[i,j] = arctan(y/x) + pi
elif x&<0 and y&<0: img[i,j] = arctan(y/x) - pi elif x==0 and y&>0:
img[i,j] = pi / 2
elif x==0 and y&<0: img[i,j] = pi / -2 elif x==0 and y==0: img[i,j] = 0.0 print img imshow(img, cmap=cm.hsv) show()


搜索hsv色彩空間:


如果根據這幅圖,「光碟」的意思就是每一條半徑的顏色在色相Hue上漸變。
關於色相是什麼(反正這裡說的不是可以用來犧牲的那個色相了),可以參看Wiki:HSL和HSV色彩空間,那個H就是色相Hue。
有點像下面這幅圖的橫截面(摘自Wiki)

只不過明度Chroma沒有變化。
這樣的話,蠻簡單的啊。對每個像素算出它所在半徑的角度 0~2π 然後映射到Hue的值域上就是了。
具體實現的話,話說可以用OpenCV嗎?反正一些圖像庫裡面是有HSR到RGB的轉換函數的。(我一直都不明白所謂邀請是怎麼回事,以及為什麼大家都愛說謝邀)


補充一個python的:

from pylab import *

x, y = mgrid[-300:300, -300:300]
circle = Circle((0, 0), 1, alpha=0)
gca().add_patch(circle)
imshow(arctan2(x, y), cmap="hsv", extent=[-1, 1, -1, 1]).set_clip_path(circle)
show()


Photoshop大法好, 點三下滑鼠就出


看到題目的配圖的時候,很奇怪。。。

點進圖片後又是正常的。。

iPad系統9.3.4
沒回答題主問題,不知道算不算違規,但是又不知道該發到哪裡去。。。



用html5+css3應該最簡單吧!


這個
https://wwwzhihu.com/question/30262900/answer/487410262


期待mma的代碼,估計一條語句搞定


推薦閱讀:

TAG:Python | MATLAB | Wolfram Mathematica | R(編程語言) | Matplotlib |