मुझे एक परिपत्र पैटर्न - पायथन, ज्यामिति, कम्प्यूटेशनल-ज्यामिति विकसित करने में मदद की ज़रूरत है

I am trying to generate this pattern and instead of adding for loops और अनुमानित कोण (मुझे लगता है कि अंत की ओर कोण बंद हो सकता है)। मैं सोच रहा था कि क्या कोई कम कोड वाले इस पैटर्न को बनाने में कुछ अंतर्दृष्टि प्रदान कर सकता है।

अंतिम लक्ष्य केवल त्रिज्या का वर्णन करना होगा और हलकों की कितनी परतें मैं उत्पन्न करना चाहता हूं

import numpy as np
import matplotlib.pyplot as plt

__author__ = "George Pamfilis"

def rotate_around_origin(r,angle):
# http://tutorial.math.lamar.edu/Classes/CalcII/PolarCoordinates.aspx
x = r * np.cos(angle)
y = r * np.sin(angle)
return x, y

if __name__ == "__main__":
r = 1
r_cylinder = 1
p1 = (0, 0)
ps = [p1]

angle = 60

# first layer
for i in range(6):
p_new = rotate_around_origin(2*r + (r/2) * 0, np.deg2rad(angle))
ps.append(p_new)
angle += 60

# second layer


angle = 30

for i in range(6):
p_new = rotate_around_origin(3*r+(r/2) * 1, np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60
for i in range(6):
p_new = rotate_around_origin(4*r+(r/2)*0, np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60 + 30/2 + 4

for i in range(6):
p_new = rotate_around_origin(5*r+(r/3), np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60 +30/2 + 4 -8 + 30

for i in range(6):
p_new = rotate_around_origin(5*r+(r/3), np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60
for i in range(6):
p_new = rotate_around_origin(5*r+(r/1)*1, np.deg2rad(angle))
ps.append(p_new)
angle += 60

angle = 30
for i in range(6):
p_new = rotate_around_origin(6 * r + (r / 1) * 1, np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60 +13.75
for i in range(6):
p_new = rotate_around_origin(6*r+(r/1)*1+r/4, np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 46.25
for i in range(6):
p_new = rotate_around_origin(6*r+(r/1)*1+r/4, np.deg2rad(angle))
ps.append(p_new)
angle += 60


angle = 60
for i in range(6):
p_new = rotate_around_origin(6*r+(r/1)*1+r/4 + (r/1.25), np.deg2rad(angle))
ps.append(p_new)
angle += 60


plt.figure(figsize=(20, 20 * (1/1)))

fig = plt.gcf()
# circle1 = plt.Circle((0, 0), 6*r+r+r+r/2+r, color="r")
# this is added just to enclose the pattern.
circle1 = plt.Circle((0, 0), 6*r+r+r+r, color="r")

fig.gca().add_artist(circle1)
for p in ps:
circle1 = plt.Circle((p[0], p[1]), r)
fig.gca().add_artist(circle1)


plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.show()

यहां छवि विवरण दर्ज करें

उत्तर:

उत्तर № 1 के लिए 1

दिए गए बड़े R और परतों की संख्या (केंद्रीय छोटे वृत्त सहित रिंग) के लिए छोटा वृत्त त्रिज्या खोजें

क्षैतिज परतों की संख्या ज्ञात कीजिए

प्रत्येक क्षैतिज परत के लिए पहले और अंतिम छोटे वृत्त की स्थिति की गणना करें

Working Delphi example:

var
cx, cy, R, NL, irs: Integer;
rs, yshift, dx: Double;
iymax, ix, iy, mx, my, il, ir, Nl4: Integer;
begin
R := 180;
NL := 8;
cx := 200;
cy := 200;
Canvas.Brush.Color := clRed;
Canvas.Ellipse(cx - R, cy - R, cx + R + 1, cy + R + 1);
Canvas.Brush.Color := clBlue;

rs := R / (2 * NL - 1); // small radius
irs := Round(rs); // integer radius for drawing
Nl4 := 4 * (NL - 1) * (NL - 1);
iymax := Floor((2 * NL - 2) / Sqrt(3)); // horizontal layers from center to top

for iy := -iymax to iymax do
begin
yshift := iy * Sqrt(3) * rs; // relative to center
my := cy + Round(yshift); // y-coordinate

// find left small circle inside big one
if Odd(iy) then
begin
il := Floor(0.5 * Sqrt(Nl4 - 3 * iy * iy) + 0.5);
dx := rs;
ir := 1;
end
else
begin
il := Floor(0.5 * Sqrt(Nl4 - 3 * iy * iy));
dx := 0;
ir := 0;
end;

for ix := -il to il - ir do
begin
mx := cx + Round(ix * 2 * rs + dx);
Canvas.Ellipse(mx - irs, my - irs, mx + irs + 1, my + irs + 1);
end;
end;

यहां छवि विवरण दर्ज करें


संबंधित सवाल
सबसे लोकप्रिय