0

百聞は一見にしかず…

ここに画像の説明を入力

(1) 2 つの円が明らかに完全な円である、(2) 各領域の開始部分と終了部分を角度で定義できる、たとえばセクション 1 のような画像を生成する方法を知りたいです。垂直方向から 0 ラジアンで開始し、垂直方向から pi/2 ラジアンで終了するなど、(3) 各領域の色を定義できます。

実際、リングの外側と内側に黒い境界線があってはなりません。各領域の境界線は、各領域と同じ色にする必要があります。

たとえば、ImageMagick でこれを行うにはどうすればよいでしょうか。

4

3 に答える 3

1

私は円よりも直線で考えるのが得意なので、まったく別の方法でもう一度やってみようと思いました...

まず、次のように環状線を直線で描きます。

convert -size 45x40 xc:red xc:lime -size 270x40 xc:blue +append line.png

ここに画像の説明を入力

線分の長さをこっそり合計して 360 にしたので、1 度あたり 1 ピクセルになりました - 私の単純な脳が対処できるように:-) つまり、45 ピクセル (度) の赤、45 ピクセル (度) があります。ライムの 270 ピクセル (度) と青の 270 ピクセル (度) がすべて追加され+append、線が作成されます。最初の-size 45x40設定は、後で変更するまで保持されるため、青に適用する準備ができるように変更する前に、赤とライムの両方の線セグメントに適用されることに注意してください。

次に、次のように、その線を円の周りに曲げます。

convert line.png -virtual-pixel White -distort arc 360 result.png

ここに画像の説明を入力

次のように、概念に慣れたら、すべてを一度に行うこともできます。

convert -size 60x40 xc:red xc:lime xc:blue xc:cyan xc:magenta xc:black +append -virtual-pixel White -distort arc 360 result.png

ここに画像の説明を入力

次のように、年輪セグメントに灰色の境界線を追加できます。

convert -size 600x400 xc:red xc:lime xc:blue xc:cyan xc:magenta xc:black -bordercolor "rgb(180,180,180)" -border 20 +append -virtual-pixel White -distort arc 360 result.png

ここに画像の説明を入力

すべてを透明な背景にしたい場合は、white上記のすべてを に変更しnoneます。

于 2015-08-03T07:56:16.730 に答える
1

私はほとんど知りませんgnuplotが、おそらくここでの法案に適合すると思います.私のコマンドは粗雑かもしれませんが、かなり読みやすく効果的です. 私より賢い人が改善できるかもしれません!

とにかく、ここに私が思いついたスクリプトがあります:

set xrange [-1:1]
set yrange [-1:1]
set angles degrees
set size ratio -1
# r1 = annulus outer radius, r2 = annulus inner radius
r1=1.0
r2=0.8
unset border; unset tics; unset key; unset raxis
set terminal png size 1000,1000
set output 'output.png'
set style fill solid noborder
set object circle at first 0,0 front size r1 arc [0:60]    fillcolor rgb 'red'
set object circle at first 0,0 front size r1 arc [60:160]  fillcolor rgb 'green'
set object circle at first 0,0 front size r1 arc [160:360] fillcolor rgb 'blue'

# Splat a white circle on top to conceal central area
set object circle at first 0,0 front size r2 fillcolor rgb 'white'

plot -10 notitle

結果は次のとおりです。

ここに画像の説明を入力

したがって、上記のスクリプトを保存してannulus.cmd実行するとoutput.png、次のコマンドを使用してファイルが作成されます。

gnuplot annulus.cmd

明らかに、スクリプトの根幹は、set object circle開始角度と終了角度のセットが異なる、異なる色の個別の環セグメントを作成する、それぞれが開始する 3 つの行です。

ぐるぐる回っていくつかのことを変更すると、次のようになります。

set xrange [-1:1]
set yrange [-1:1]
set angles degrees
set size ratio -1
# r1 = annulus outer radius, r2 = annulus inner radius
r1=1.0
r2=0.4
unset border; unset tics; unset key; unset raxis
set terminal png size 1000,1000
set output 'output.png'
set style fill solid noborder
set object circle at first 0,0 front size r1 arc [0:60]    fillcolor rgb 'red'
set object circle at first 0,0 front size r1 arc [60:120]  fillcolor rgb 'green'
set object circle at first 0,0 front size r1 arc [120:180] fillcolor rgb 'blue'
set object circle at first 0,0 front size r1 arc [180:240] fillcolor rgb 'yellow'
set object circle at first 0,0 front size r1 arc [240:300] fillcolor rgb 'black'
set object circle at first 0,0 front size r1 arc [300:360] fillcolor rgb 'magenta'

# Splat a white circle on top to conceal central area
set object circle at first 0,0 front size r2 fillcolor rgb 'white'

plot -10 notitle

ここに画像の説明を入力

于 2015-08-02T17:12:29.943 に答える
1

Arc コマンドを使用して、ベクター グラフィックスで環を作成できます。パラメータの詳細については、 Mozilla のパス ドキュメントを参照してください。

-drawImageMagick を使用すると、ベクター グラフィックの任意の部分を作成できます。例:

convert -size 100x100 xc:transparent -stroke black -strokewidth 1 \
        -fill blue  -draw 'path "M 10 50 A 40 40 0 0 1 50 10 L 50 20 A 30 30 0 0 0 20 50 Z"' \
        -fill red   -draw 'path "M 50 10 A 40 40 0 0 1 90 50 L 80 50 A 30 30 0 0 0 50 20 Z"' \
        -fill green -draw 'path "M 90 50 A 40 40 0 0 1 10 50 L 20 50 A 30 30 0 0 0 80 50 Z"' \
        annulus.png

環

他の素晴らしい例here、およびhere

アップデート

よりプログラム的なアプローチを作成するには、任意のOOPスクリプト言語を使用します。以下は Python とWandの簡単な例ですが、Ruby とRMagickも強くお勧めします。

#!/usr/bin/env python3

import math

from wand.color import Color
from wand.drawing import Drawing
from wand.image import Image

class Annulus(Image):
  def __init__(self, inner, outer, padding=5):
    self.Ri = inner
    self.Ro = outer
    side = (outer + padding) * 2
    self.midpoint = side/2
    super(Annulus, self).__init__(width=side,
                                  height=side,
                                  background=Color("transparent"))
    self.format = 'PNG'

  def __iadd__(self, segment):
    cos_start, cos_end = math.cos(segment.As), math.cos(segment.Ae)
    sin_start, sin_end = math.sin(segment.As), math.sin(segment.Ae)
    SiX, SiY = self.midpoint + self.Ri * cos_start, self.midpoint + self.Ri * sin_start
    SoX, SoY = self.midpoint + self.Ro * cos_start, self.midpoint + self.Ro * sin_start
    EiX, EiY = self.midpoint + self.Ri * cos_end,   self.midpoint +  self.Ri * sin_end
    EoX, EoY = self.midpoint + self.Ro * cos_end,   self.midpoint + self.Ro * sin_end
    with Drawing() as draw:
      for key, value in segment.draw_args.items():
        setattr(draw, key, value)
      draw.path_start()
      draw.path_move(to=(SiX, SiY))
      draw.path_elliptic_arc(to=(EiX, EiY),
                             radius=(self.Ri, self.Ri),
                             clockwise=True)
      draw.path_line(to=(EoX, EoY))
      draw.path_elliptic_arc(to=(SoX, SoY),
                             radius=(self.Ro, self.Ro),
                             clockwise=False)
      draw.path_close()
      draw.path_finish()
      draw(self)
    return self

class Segment(object):
  def __init__(self, start=0.0, end=0.0, **kwargs):
    self.As = start
    self.Ae = end
    self.draw_args = kwargs

if __name__ == '__main__':
  from wand.display import display
  ring  = Annulus(20, 40)
  ring += Segment(start=0,
                  end=math.pi/2,
                  fill_color=Color("yellow"))
  ring += Segment(start=math.pi/2,
                  end=math.pi,
                  fill_color=Color("pink"),
                  stroke_color=Color("magenta"),
                  stroke_width=1)
  ring += Segment(start=math.pi,
                  end=0,
                  fill_color=Color("lime"),
                  stroke_color=Color("orange"),
                  stroke_width=4)
  display(ring)

プログラマティック年輪

于 2015-07-29T21:38:58.420 に答える