両側に半円があり、黒く塗られた正多角形(最大n = 12)を描画します

Aug 23 2020

n辺に正多角形を描く必要があります。辺Lの場合はn <13、L <11はcmです。側面に半円があり、後で印刷して切り取るためにxxx.png画像として保存するように完全に黒になっています。重要なのは、画面上の寸法がcm単位であるということです。後でトリミングする画像と同じです。私たちを手伝ってくれますか。このような例をフォーラムでいくつか見ましたが、変更する方法が見つかりません。アイデアの写真を添付し​​ます(ただし、白い背景に、正方形や境界線のない完全な黒)

L = 12;
Graphics[Line[{{L, 0}, {L/2, L Sqrt[3]/2}, {-L/2, L Sqrt[3]/2}, {-L, 
0}, {-L/2, -L Sqrt[3]/2}, {L/2, -L Sqrt[3]/2}, {L, 0}}]]

回答

5 J.M.'sennui Aug 23 2020 at 06:13

明らかな方法は、オブジェクトをつなぎ合わせてRegularPolygon[]適切に配置Disk[]することですが、通常は不要な継ぎ目が発生します。これを回避するために、代わりに、半円のNURBS表現を使用してFilledCurve[]、の結果からオブジェクトを作成できますCirclePoints[]

With[{r = 2, θ = π/2, n = 7}, 
     Graphics[FilledCurve[MapIndexed[With[{d = (EuclideanDistance @@ #1)
                                               Normalize[Cross[Subtract @@ #1]]/2},
                                          BSplineCurve[If[#2 === {1}, Identity, Rest]
                                                       [{#1[[1]], #1[[1]] + d,
                                                         #1[[2]] + d, #1[[2]]}],
                                                       SplineDegree -> 2,
                                                       SplineKnots -> {0, 0, 0, 1/2,
                                                                       1, 1, 1},
                                                       SplineWeights -> {1, 1/2,
                                                                         1/2, 1}]] &,
                                     Partition[N[CirclePoints[{r, θ}, n]], 2, 1, 2]]]]]

3 C.E. Aug 23 2020 at 07:05

これは、JMによっても言及されている素朴なアプローチです(しかし、彼は別のアプローチを実装しました):

draw[n_, {w_, h_}] := Module[{pts, segments, midPoints, lengths},
  pts = With[{ipts = CirclePoints[n]}, Append[ipts, First[ipts]]];
  segments = Partition[pts, 2, 1];
  midPoints = Mean /@ segments;
  lengths = Norm[First[#] - Last[#]] & /@ segments;
  Graphics[{
    MapThread[Disk, {midPoints, lengths/2}],
    Polygon[pts]
    },
   ImageSize -> (72/2.54) {w, h},
   PlotRangePadding -> 0
   ]
  ]

draw[7, {10, 10}]

ImageSize -> (72/2.54) {w, h}うまくいけば、このグラフィックをエクスポートして印刷すると、wxhセンチメートルの大きさになります。プロット範囲のパディングを削除しました。そうしないと、図のサイズにカウントされるためです。で説明されているようにImageSize、図のサイズがプリンタのポイントで示されているため、72という数字が入ります。

ここでの議論を考えると、Mathematicaから直接印刷することに注意する必要があるようです。より良いアプローチは、PDFなどにエクスポートしてから印刷することです。

3 kglr Aug 24 2020 at 00:47
r = 12;
Graphics[{#, Disk[RegionCentroid @ #, r/2] & /@ MeshPrimitives[#, 1]}] & @ 
   RegularPolygon[r, 6]