如何用簡單的演算法生成一個類似『光碟』的彩色圓形圖片?
大概就像下圖所示的樣子
補充一下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步。因為光碟的顏色只與角度關(同一個角度上的所有點顏色相同),所以呢,只需要在不同角度上畫不同顏色的直線就行了,顏色的變化規律就按照剛才找到的規律來。
改編自@馮昱堯的代碼
...被搶先了... 基本上就是在這個圓上顏色的色相(Hue),只與該點與圓心連線的夾角有關。知道這一點你就做一幅圖像,然後遍歷每一個點,把該點的坐標值轉換為極坐標,色相值就是極坐標角度。 用 matplotlib 實現的話有個小技巧,把imshow的cmap改為hsv就可以直接按照色相來畫。from pylab import *
n=300
img=[[arctan2(x,y) if x*x+y*y&
# -*- 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 |