วาดศรียันต์


11

ท้าทาย:

วาดศรี Yantra

ทำอย่างไร:

มีวิธีการวาดที่แตกต่างกัน ทุกขั้นตอนมีหลายขั้นตอน หากคุณคิดว่าคุณสามารถวาดได้โดยไม่ต้องทำตามขั้นตอนที่เชื่อมโยงเลื่อนด้านล่างสำหรับองค์ประกอบที่คุณต้องมีในการวาดภาพของคุณ

ขั้นตอนที่สมบูรณ์สามารถพบได้ที่นี่:

http://www.saralhindi.com/Shri_Yantra/makingsky14steps_eng.htm

( ฉันไม่ได้คัดลอกมาที่นี่เพราะมันจะกลายเป็นคำถามที่ยาวมากนี่คือกระจกเงา archieve.org ในกรณีที่การเชื่อมโยงครั้งแรกเคยลง )

ภาพสุดท้ายควรดูเหมือนภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

จำเป็นต้องมี:

โดยทั่วไปวิธีการวาดภาพที่คุณเลือกจะเป็นคำตอบที่ถูกต้องซึ่งคุณจะต้องรักษาองค์ประกอบที่สำคัญที่สุด

  1. จำนวนสามเหลี่ยมควรเท่ากับตัวเลขในภาพด้านบน (สามเหลี่ยมเล็ก 43 อันเป็นผลมาจากการแทรกของสามเหลี่ยม 9 อันที่ใหญ่กว่า)

  2. สี่แยกนี้มีความเคารพ:

ป้อนคำอธิบายรูปภาพที่นี่

  1. เคล็ดลับของรูปสามเหลี่ยมด้านบนนั้นแตะที่ฐานของรูปสามเหลี่ยมทั้ง 4 รูปลงและคำแนะนำของรูปสามเหลี่ยมด้านล่างควรแตะที่ฐานของรูปสามเหลี่ยมทั้งสามด้านดังที่แสดงในรูปด้านล่าง

    ป้อนคำอธิบายรูปภาพที่นี่

  2. วงกลมด้านใน (bindu) เป็นศูนย์กลางกับวงนอก

  3. เคล็ดลับ (จุดยอด) ของสามเหลี่ยมที่ใหญ่กว่าควรแตะที่วงกลมด้านนอก: ป้อนคำอธิบายรูปภาพที่นี่

  4. ภาพสุดท้ายควรมีองค์ประกอบทั้งหมดและควรมีลักษณะดังนี้: ป้อนคำอธิบายรูปภาพที่นี่

  5. สีควรจะเหมือนกับภาพด้านบนสำหรับทุก ๆ องค์ประกอบ (รวมถึงกลีบ)

  6. รูปร่างของกลีบดอกไม้ควรมีลักษณะคล้ายกับในภาพตะโกน แต่อาจเป็นเพียงครึ่งวงกลมหรือส่วนโค้งที่เรียบง่ายของวงกลม:

  7. ไม่มีข้อ จำกัด สัดส่วนที่เข้มงวดกับวงกลมหรือขนาดของประตู แต่วงกลมด้านนอกส่วนใหญ่ควรมีเส้นผ่านศูนย์กลางไม่น้อยกว่า 90% ของด้านนอกของจัตุรัสด้านนอกองค์ประกอบอื่น ๆ จะถูกจัดเรียงตามลำดับสัมพันธ์กับสัดส่วนนี้

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ภาษาโปรแกรมและผลลัพธ์

ไม่มีข้อ จำกัด ในภาษาการเขียนโปรแกรมหรือรูปแบบของผล (อาจเป็นภาพเวกเตอร์, บิตแมปภาพ, ผ้าใบ ฯลฯ ) โดยมีเงื่อนไขว่าผลลัพธ์ค่อนข้างชัดเจนและมองเห็นได้ (อย่างน้อย 800px X 800px)

การแก้ไขในภายหลัง: ไม่มีวิธีการวาดที่สมบูรณ์แบบเนื่องจากบล็อกนี้สำรวจได้ดี: http://fotthewuk.livejournal.com/ การยอมรับว่ามีข้อบกพร่องเล็กน้อยในบัญชี

ณ จุดนี้มันเป็นแบบฝึกหัดที่น่าสนใจที่จะเรียนรู้ว่ามันเป็นไปได้มากที่ไม่มีวิธีแก้ปัญหาที่สมบูรณ์แบบเหมือนการยกกำลังสองของวงกลม


3
ฉันคิดว่าคุณจะต้องกำหนดจานสีขนาดความยาวที่เกี่ยวข้องของวงกลมด้านนอกและพื้นหลังและรูปร่างของกลีบ
Martin Ender

@ MartinBüttnerฉันได้แก้ไขคำถามอีกครั้งโปรดบอกฉันว่าข้อมูลดีขึ้นหรือไม่ การวาด Yantra นี้ไม่ใช่เรื่องง่ายและการวางรายละเอียดก็ค่อนข้างท้าทายเช่นกัน
Eduard Florinescu

สวัสดีฉันรู้ว่าสเป็คนี้ยากมากในอันนี้ แต่มันเป็นสิ่งจำเป็น คำถามที่คล้ายกันเมื่อไม่นานมานี้ของฉันก็มีช่วงเวลาที่ลำบากเพราะสเป็คดังนั้นมันดีกว่าที่คุณจะมาด้วยเพราะถ้าไม่มีสิ่งนี้มันยากเกินกว่าที่จะวาดและไม่ได้ท้าทายอย่างแท้จริง
เครื่องมือเพิ่มประสิทธิภาพ

5
ความท้าทายนี้มันบ้า
อัล

1
ขอขอบคุณลองคิดดูสิแล้ว;) แล้วไอ้นี่มันยากแค่ทำสามเหลี่ยมเสร็จแล้วรหัสของฉันก็ใหญ่แล้ว ปรับให้เหมาะสมแล้วตอนนี้ xD
Teun Pronk

คำตอบ:


8

Mathematica - 2836 2536 ตัวอักษร

มันค่อนข้างงงที่จะคิดคอมโบของภูมิภาคที่ทำให้สามเหลี่ยมเล็ก ๆ สำหรับระบายสี

กรอบ

วัตถุเฟรมเป็นอสมการที่อธิบายว่าเป็นภูมิภาค เช่นหอยเชลล์สีแดงและสีเหลืองเป็นวงกลมสองส่วน

n1=8;n2=16;
w8=Round[.78 Table[{Cos[2\[Pi] k/n1],Sin[2\[Pi] k/n1]},{k,0,n1-1}],.01];
w16=Round[1 Table[{Cos[2\[Pi] k/n2],Sin[2\[Pi] k/n2]},{k,0,n2-1}],.01];
n=12;y1=.267;
x2=1/Sqrt[2];w=1.8;v=1.85;
pts={{-w,w},{-w/4,w},{-w/4,w+w/8},{-5w/8,w+w/8},{-5w/8,w+5w/24},{5w/8,w+5w/24},{5w/8,w+w/8},{w/4,w+w/8},{w/4,w},
{w,w},{w,w/4},{w+w/8,w/4},{w+w/8,5w/8},{w+5w/24,5w/8},{w+5w/24,-5w/8},{w+w/8,-5w/8},{w+w/8,-w/4},{w,-w/4},
{w,-w},
{w/4,-w},{w/4,-w-w/8},{(5 w)/8,-w-w/8},{(5 w)/8,-w-(5 w)/24},{-((5 w)/8),-w-(5 w)/24},{-((5 w)/8),-w-w/8},{-(w/4),-w-w/8},{-(w/4),-w},{-w,-w},

{-w,-w/4},{-w-w/8,-w/4},{-w-w/8,-5w/8},{-w-5w/24,-5w/8},{-w-5w/24,5w/8},{-w-w/8,5w/8},{-w-w/8,w/4},{-w,w/4}
};

frame=RegionPlot[{
(*MeshRegion[pts2,Polygon[Range[20]]],*) (*orange trim *)
MeshRegion[pts,Polygon[Range[Length[pts]]]], (*green box *)
ImplicitRegion[x^2+y^2<2.8,{x,y}], (*white, largest circle *)
ImplicitRegion[Or@@(((x-#)^2+(y-#2)^2<.1)&@@@w16),{x,y}], (*yellow scallops*)
ImplicitRegion[x^2+y^2<1,{x,y}],(*white circle *)
ImplicitRegion[x^2+y^2<1.4,{x,y}],(*white disk*)
ImplicitRegion[Or@@(((x-#)^2+(y-#2)^2<.15)&@@@w8),{x,y}],(*red scallops*)
ImplicitRegion[x^2+y^2<1,{x,y}] , (*white disk *)
ImplicitRegion[1.8 < x^2+y^2< 2.2,{x,y}] ,(*brown outer rim*)
ImplicitRegion[2.4 < x^2+y^2< 2.8,{x,y}](*yellow outer rim*)},
BoundaryStyle->Directive[Thickness[.005],Black],
AspectRatio->1,
Frame-> False,
PlotStyle->{(*Lighter@Orange,*)
Darker@Green,White,Yellow,White,White,
Red,White,Lighter@Brown,Yellow,Red,
White,White,White,White,White,
White,White,Red,Red,Darker@Blue,
Darker@Blue,Darker@Blue,Darker@Blue,Darker@Blue,Darker@Blue,
Red,Red,Darker@Blue,Red,Yellow,Red}];

จากนั้นมีดิสก์เพื่อซ่อนวงกลมบางวงที่ใช้ทำสแกลลอป

Graphics[{White,Disk[{0,0},.99]}]

เครื่องใน

คำจำกัดความบางอย่างของจุดยอดและสามเหลี่ยม แต่ละรูปสามเหลี่ยม, t1, t2, ... เป็นขอบเขตที่ชัดเจน การทำงานแบบลอจิคัล ( RegionUnion. RegionIntersectionและRegionDifference) บนสามเหลี่ยมขนาดใหญ่ใช้เพื่อกำหนดเซลล์สามเหลี่ยมขนาดเล็กลงให้เป็นพื้นที่ที่ได้รับซึ่งสามารถทำสีแยกกันได้

p1={-Cos[ArcTan[.267]],y1};
p2={Cos[ArcTan[.267]],y1};
p3={-Cos[ArcTan[.267]],-y1};
p4={Cos[ArcTan[.267]],-y1};
p5={-x2,(x2+y1)/2};
p6={x2,(x2+y1)/2};
p7={-x2,-(x2+y1)/2};
p8={x2,-(x2+y1)/2};
p9={0.5,-x2};
p10={-0.5,-x2};
p11={0.5,-x2};
p12={-0.5,-x2};
p13={a=-.34,b=-.12};
p14={-a,b};
p15={0.5,x2};
p16={-0.5,x2};  
t1=MeshRegion[{{0,-1},p1,p2},Triangle[{1,2,3}]];
t2=MeshRegion[{{0,1},p3,p4},Triangle[{1,3,2}]];
t3=MeshRegion[{{0,-x2},p5,p6},Triangle[{1,3,2}]];
t4=MeshRegion[{{0,x2},p7,p8},Triangle[{1,3,2}]];
t5=MeshRegion[{{0,+y1},p9,p10},Triangle[{1,3,2}]];
t6=MeshRegion[{{0,p5[[2]]},p13,p14},Triangle[{1,3,2}]];
t7=MeshRegion[{{0,p13[[2]]},p15,p16},Triangle[{1,3,2}]];
t8=MeshRegion[{{0,p7[[2]]},{-.33,p1[[2]]-.12},{.33,p1[[2]]-.12}},Triangle[{1,3,2}]];
t9=MeshRegion[{{0,p3[[2]]},{z=-.23,0.063},{-z,.063}},Triangle[{1,3,2}]];

disk=Graphics[{White,Disk[{0,0},.99]}];


innards=RegionPlot[{
t1,t2,t3,t4,t5,t6,t7,t8,t9,(*White*)
RegionDifference[t1,RegionUnion[t5,t4,t2]],(*Blue*)
RegionDifference[t4,RegionUnion[t1,t3,t5]],(*red*)
RegionDifference[t3,RegionUnion[t7,t4,t2]], (*blue*)
RegionDifference[t2,RegionUnion[t1,t7,t3]], (*blue*)
RegionDifference[t5,t1],   (*blue*)
RegionDifference[t4,RegionUnion[t1,t7]], (*Blue *)
RegionDifference[t7,t2],(*Blue*)
RegionDifference[t3,RegionUnion[t1,t2]],(*Blue *)
RegionDifference[t8,t2],  (* blue *)
RegionDifference[t9,t5],  (* red *)
RegionDifference[t9,t6],  (* red *)
RegionIntersection[t4,RegionDifference[t6,t1]], (*blue*)
RegionIntersection[t6,RegionDifference[t5,t8]],  (* red *)
RegionIntersection[t7,t9], (*yellow*)
RegionDifference[RegionIntersection[t7,t8],t5], (*red *)
RegionDifference[RegionIntersection[t5,t6],RegionUnion[t7,t9]],(*red *)
ImplicitRegion[x^2+y^2<= .001,{x,y}],  (* smallest circle *) (* red *)
RegionDifference[RegionIntersection[t7,t1 ],t6], (*Red*)
RegionDifference[t8,RegionUnion[t5,t6]],
RegionDifference[t6,RegionUnion[t7,t8]],
RegionDifference[RegionIntersection[t2,t5],RegionUnion[t7,t8]],
RegionDifference[RegionIntersection[t7,t3],t4],
RegionDifference[RegionIntersection[t1,t3],RegionUnion[t5,t4]],
RegionDifference[RegionIntersection[t2,t4],RegionUnion[t7,t3]],
RegionDifference[RegionIntersection[t5,t4],t3]},
BoundaryStyle->Directive[Thickness[.005],Black],
AspectRatio->1,
PlotStyle->{
White,White,White,White,White,White,White,White,White,
Blue,Red,Red,Blue,Blue,Blue,Blue,Blue,Blue,
Red,Red,Blue,Red,Yellow,Red,Red,Red,Blue,Blue,Blue,Blue,Red,Red,Red,Red}]

ใส่ชิ้นส่วนเข้าด้วยกัน

Show[frame,disk,innards,Graphics[{Brown,Thickness[.02],Line[Append[pts,{-w,w}]]}];
Graphics[{RGBColor[0.92,0.8,0.],Thickness[.015],Line[Append[pts,{-w,w}]]}]]

sri4


แข็งแรงเล่นกอล์ฟ

r=ImplicitRegion;m=MeshRegion;t=Triangle;d=RegionDifference;u=RegionUnion;i=RegionIntersection;(*s=ImplicitRegion*)

n1=8;n2=16;w8=.78 Table[{Cos[2\[Pi] k/n1],Sin[2\[Pi] k/n1]},{k,0,n1-1}];
w16=Table[{Cos[2\[Pi] k/n2],Sin[2\[Pi] k/n2]},{k,0,n2-1}];n=12;y1=.267;x2=1/Sqrt[2];w=1.8;v=1.85;
pts={{-w,w},{-w/4,w},{-w/4,w+w/8},{-5w/8,w+w/8},{-5w/8,w+5w/24},{5w/8,w+5w/24},{5w/8,w+w/8},{w/4,w+w/8},{w/4,w},
{w,w},{w,w/4},{w+w/8,w/4},{w+w/8,5w/8},{w+5w/24,5w/8},{w+5w/24,-5w/8},{w+w/8,-5w/8},{w+w/8,-w/4},{w,-w/4},
{w,-w},{w/4,-w},{w/4,-w-w/8},{(5 w)/8,-w-w/8},{(5 w)/8,-w-(5 w)/24},{-((5 w)/8),-w-(5 w)/24},{-((5 w)/8),-w-w/8},{-(w/4),-w-w/8},{-(w/4),-w},{-w,-w},
{-w,-w/4},{-w-w/8,-w/4},{-w-w/8,-5w/8},{-w-5w/24,-5w/8},{-w-5w/24,5w/8},{-w-w/8,5w/8},{-w-w/8,w/4},{-w,w/4}};

frame=RegionPlot[{
m[pts,Polygon[Range[Length[pts]]]], 
r[x^2+y^2<2.8,{x,y}], 
r[Or@@(((x-#)^2+(y-#2)^2<.1)&@@@w16),{x,y}], 
r[x^2+y^2<1,{x,y}],
r[x^2+y^2<1.4,{x,y}],
r[Or@@(((x-#)^2+(y-#2)^2<.15)&@@@w8),{x,y}],
r[x^2+y^2<1,{x,y}] , 
r[1.8 < x^2+y^2< 2.2,{x,y}] ,
r[2.4 < x^2+y^2< 2.8,{x,y}]},
BoundaryStyle->Directive[Thickness[.003],Black],
AspectRatio->1,
Frame-> False,
PlotStyle->{Darker@Green,White,Yellow,White,White,Red,White,Lighter@Brown,Yellow,Red}];

c=Cos[ArcTan[y1]];
p1={-c,y1};
p2={c,y1};
p3={-c,-y1};
p4={c,-y1};
p5={-x2,(x2+y1)/2};
p6={x2,(x2+y1)/2};
p7={-x2,-(x2+y1)/2};
p8={x2,-(x2+y1)/2};
p9={0.5,-x2};
p10={-0.5,-x2};
p11={0.5,-x2};
p12={-0.5,-x2};
p13={a=-.34,b=-.12};
p14={-a,b};
p15={0.5,x2};
p16={-0.5,x2};
t1=m[{{0,-1},p1,p2},t[{1,2,3}]];
t2=m[{{0,1},p3,p4},t[{1,3,2}]];
t3=m[{{0,-x2},p5,p6},t[{1,3,2}]];
t4=m[{{0,x2},p7,p8},t[{1,3,2}]];
t5=m[{{0,+y1},p9,p10},t[{1,3,2}]];
t6=m[{{0,p5[[2]]},p13,p14},t[{1,3,2}]];
t7=m[{{0,p13[[2]]},p15,p16},t[{1,3,2}]];
t8=m[{{0,p7[[2]]},{-.33,p1[[2]]-.12},{.33,p1[[2]]-.12}},t[{1,3,2}]];
t9=m[{{0,p3[[2]]},{z=-.23,0.063},{-z,.063}},t[{1,3,2}]];

innards=RegionPlot[{
d[t1,u[t5,t4,t2]],
d[t4,u[t1,t3,t5]],
d[t3,u[t7,t4,t2]], 
d[t2,u[t1,t7,t3]], 
d[t5,t1],   
d[t4,u[t1,t7]], 
d[t7,t2],
d[t3,u[t1,t2]],
d[t8,t2],  
d[t9,t5],  
d[t9,t6],  
i[t4,d[t6,t1]], 
i[t6,d[t5,t8]],  
i[t7,t9], 
d[i[t7,t8],t5], 
d[i[t5,t6],u[t7,t9]],
r[x^2+y^2<= .001,{x,y}],   
d[i[t7,t1 ],t6], 
d[t8,u[t5,t6]],
d[t6,u[t7,t8]],
d[i[t2,t5],u[t7,t8]],
d[i[t7,t3],t4],
d[i[t1,t3],u[t5,t4]],
d[i[t2,t4],u[t7,t3]],
d[i[t5,t4],t3]},
BoundaryStyle->Directive[Thickness[.003],Black],
Frame->False,
PlotStyle->{Blue,Red,Red,Blue,Blue,Blue,Blue,Blue,Blue,
Red,Red,Blue,Red,Yellow,Red,Red,Red,Blue,Blue,Blue,Blue,Red,Red,Red,Red}];

trim=Graphics[{RGBColor[0.92,0.8,0.],Thickness[.01],Line[Append[pts,{-w,w}]]}];
trim2=Graphics[{Brown,Thickness[.02],Line[Append[pts,{-w,w}]]}];
Show[frame,Graphics[{White,Disk[{0,0},.99]}],trim2,trim,innards]

2
* อวัยวะภายในและนี่เป็นสิ่งที่น่าอัศจรรย์อย่างสมบูรณ์ มี +1
Soham Chowdhury

ดิ้นรนกับสีที่นี่เช่นกันถึงแม้ว่าวงกลมด้านในที่มีรูปสามเหลี่ยมคือทั้งหมดที่ฉันมีจนถึงตอนนี้ ฉันมีบางสิ่งที่ต้องทำ;)
Teun Pronk

Teun Pronk มันช่วยให้ใช้เลเยอร์สำหรับเฟรม (ทุกอย่างนอกสามเหลี่ยมสีน้ำเงิน) กลีบดอกคล้ายดวงจันทร์สามารถทำได้โดยการเรนเดอร์วงกลมเต็มและซ้อนทับพวกมันด้วยดิสก์สีขาวขนาดใหญ่ซึ่งมีการแสดงผลส่วนกลาง สำหรับฉันส่วนที่ยากที่สุดคือการระบายสีเซลล์รูปสามเหลี่ยมด้านใน
DavidC

เหมือนกันยากจริงๆ พยายามหาบางสิ่งด้วยการเรียกซ้ำ แต่ยังไม่สามารถใช้งานได้
Teun Pronk

@DavidCarraher ฉันแก้ไขส่วนสี ต้องการคำแนะนำเกี่ยวกับมันหรือไม่?
Teun Pronk

2

Delphi [อยู่ระหว่างดำเนินการ]

อันนี้ยากจริงๆ ..
จนถึงทั้งหมดที่ฉันมีคือวงในที่มีสามเหลี่ยมและรหัสของฉันนั้นใหญ่มาก
ยังไม่ได้นับตัวละครฉันรู้ว่าฉันสามารถประหยัดได้มากในพื้นที่ว่าง ฯลฯ

เริ่มต้นกับ

ฉันทำคลาสTD T เป็นค่าเริ่มต้นของคลาสที่ไม่บังคับ แต่มันทำให้ง่ายต่อการดูคลาส D หมายถึง Draw

  TP = TPoint;
  TD = class
  private
    FCv: TCanvas;
    FC: TP;
    a:array[1..9,0..2]of TP;
    FB:TBitmap32;
    FWi: integer;
  public
    constructor Create(AC: TCanvas;CP:TP;W:integer);
    property cv: TCanvas read FCv;
    property c:TP read FC;
    property Wi:integer read FWi;
    procedure tr;
    procedure StartDrawing;
    procedure ft;          
  end;
const t=1>0;f=0>1;off=50;ic=500;

ฉันยังTPพิมพ์ไม่ได้ไม่ใช่เพราะมันเป็นชื่อย่อของฉัน แต่มันสั้นกว่าTPointและฉันคิดว่าฉันจะใช้คะแนนมาก
property Cเป็นจุดศูนย์กลางของผืนผ้าใบ
ขั้นตอน:
StartDrawing(ยังไม่ได้ถูกเปลี่ยนชื่อ) ยิงฟังก์ชั่นการวาดภาพทั้งหมดสำหรับฉัน
trทำให้สามเหลี่ยมทั้งหมดในวงกลม (รวมถึงวงกลมด้วยตัวเอง)
ftจะทำให้สีสามเหลี่ยมทั้งหมด
ฉันยังคงค่าคงที่สำหรับจริงและเท็จชดเชยและขนาดของวงกลม

หน้าที่และขั้นตอน

Qจะกลับจุดที่ 2 บรรทัดตัด / ตัดกัน
มีฟังก์ชัน / โพรซีเดอร์ซ้อนอยู่มากมาย ฉันไม่อยากอธิบายพวกเขาทั้งหมด แต่ถ้าคุณสงสัยว่ามีอะไรที่คุณสามารถถามได้ตลอดเวลา

เรียนจบ

unit Unit3;
interface
Uses
  Windows,Sysutils, Classes, DateUtils, Math, Graphics, types,idglobal, gr32, gr32_polygons, GR32_Backends;
type
  TP = TPoint;
  TD = class
  private
    FCv: TCanvas;
    FC: TP;
    a:array[1..9,0..2]of TP;
    FB:TBitmap32;
    FWi: integer;
  public
    constructor Create(AC: TCanvas;CP:TP;W:integer);
    property cv: TCanvas read FCv;
    property c:TP read FC;
    property Wi:integer read FWi;
    procedure tr;
    procedure StartDrawing;
    procedure ft;
    const
      ic=500;
  end;
  const t=1>0;f=0>1;off=50;
implementation

function q(A1,A2,B1,B2:TP;out o:int16):TP;
Var
 a,b,c:Real;
 d,e:TP;
begin
 a:=A1.X*A2.Y-A1.Y*A2.X;
 b:=B1.X*B2.Y-B1.Y*B2.X;
 d:=A1.Subtract(A2);
 e:=B1.Subtract(B2);
 c:=1/((d.X*e.Y)-(d.Y*e.X));
 Result:=TP.Create(Round(((a*e.X)-(d.X*b))*c),Round(((a*e.Y)-(d.Y*b))*c));
 o:=Result.Y;
end;
constructor TD.Create(AC: TCanvas; CP:TP;W:integer);
begin
  FCv:=AC;
  FC:=CP;
  FWi:=W;
  FB := TBitmap32.Create;
  FB.SetSize(W,W);
end;

procedure TD.ft;
var
  X,Y:int32;
  procedure cl(f,g:int32;e:TColor);
  begin
    fb.Canvas.Brush.Color:=e;
    fb.Canvas.FloodFill(f,g,clBlack32, fsBorder);
  end;
  function it(p1,p2: int32):int32;
  var i,r:int32;
  rgn:HRGN;
  begin
    r:=0;
    if fb.Pixel[x,y]<>clPurple32 then
      exit(50);
    for I := 1 to 9 do
    begin
      rgn:=CreatePolygonRgn(a[i],3,WINDING);
      if PtInRegion(rgn,p1,p2) then
        r:=r+1;
    end;
    it:=r;
  end;
begin
  Y:=c.Y;
  fb.Canvas.Brush.Color := clHighlight;
  fb.Canvas.FloodFill(1,1,clBlack32, fsBorder);
  X := c.X;
  cl(c.x-1,51,clWhite);
  for Y := 0 to fwi-1 do
    for X := 0 to fwi-1 do
      case it(x,y) of
        0,2,4,6,8:cl(x,y,clwhite);
        1,5:cl(x,y,clNavy);
        3,7:cl(x,y,clred);
      end;
end;
procedure TD.StartDrawing;
begin
  with fcv do
  begin
    Brush.Style := bsSolid;
    Brush.Color := clBtnFace;
    Ellipse(off,off,ic+off,ic+off);
    Brush.Style:=bsClear;
    tr;
    ft;
    CopyRect(ClipRect, FB.Canvas, FB.ClipRect);
    Brush.Color := clRed;
    Ellipse(c.X-10,c.Y-5,c.X+10,c.Y+15);
  end;
end;
procedure TD.tr;
const
  L=250;
var
  p1,w,v:tp;
  i:int16;
  r:TRect;
  function e(n:int16;b:boolean=f):TP;
  var r:single;
  begin
    r:=DegToRad(iif(b,n,(n*30)-90));
    Result := tp.Create(C.X +Round(L*Cos(r)),C.Y+Round(L*Sin(r)));
  end;
  function CS(Y:integer; L:boolean=t): tp;
  var
    I: integer;
  begin
    with FCv do
      if L then
      begin
        for I := 0+off to 499+off do
          if Pixels[I,Y]=0 then
            exit(TP.Create(I+1,Y));
      end
      else
        for i := 499+off downto 0+off do
          if Pixels[I,Y]=0 then
            exit(TP.Create(I-1,Y));
  end;
  procedure d(n,x,y:int16;b,c:TP);
  begin
    a[n][0]:=TP.Create(x,y);
    a[n][1]:=b;
    a[n][2]:=c;
  end;
  function Int(a,b,c,d,s1,s2:tp;h:int32):tp;
  var
    f,ww:tp;
    e:extended;
  begin
    f:=q(a,b,c,d,i);
    e:=ArcTan2(f.Y-h,f.X-c.X);
    ww:=tp.Create(C.X +ceil(500*Cos(e)),r.Bottom+ceil(500*Sin(e)));
    s2.Y:=ww.Y;
    Result:=q(f,ww,s1,s2,i);
  end;
begin
  r:=trect.Create(e(225,t),e(45,t));
  q(e(12),e(9),e(10),e(6),i);
  d(1,C.X,off+ic-1,CS(i),CS(i,f));
  q(e(12),e(8),e(9),e(6),i);
  d(2,C.X,off+1,CS(i),CS(i,f));
  w:=int(a[1][1],a[1][2],a[2][0],a[2][1],r.TopLeft,tp.Create(r.Left,0), r.Bottom);
  d(3,c.X,r.Bottom,w,tp.Create(r.Right,w.Y));
  w.Y:=r.Bottom-(w.Y-r.Top);
  d(4,c.X,r.Top,w,tp.Create(r.Right,w.Y));
  w:=int(a[1][0],a[1][1],a[4][1],a[4][2],tp.Create(r.Left,0),tp.Create(r.Bottom,0),r.Top);
  w.Y:=r.BottomRight.Y;
  v:=tp.Create(w);
  v.X := c.X+(c.X-w.X);
  d(5,c.X,a[1][1].Y,w,v);
  p1:=q(a[3][0],a[3][1],q(a[2][0],a[2][2],a[3][0],a[3][2],i),q(a[1][0],a[1][1],a[4][0],a[4][1],i),i);
  d(6,c.X,a[3][1].Y,p1,tp.Create(c.X+(c.X-p1.X),p1.Y));
  d(7,c.X,p1.Y, tp.Create(a[5][1]),tp.Create(a[5][2]));
  a[7][1].Y:=r.Top;
  a[7][2].Y:=r.Top;
  w:=q(a[6][0],a[6][1],a[7][0],a[7][1],i);
  w:=q(w,tp.Create(w.X-20,w.Y),a[4][0],a[4][1],i);
  d(8,c.X,a[4][1].Y,w,tp.Create(c.X+(c.X-w.X),w.Y));
  w:=q(a[5][0],a[5][1],a[7][0],a[7][1],i);
  w:=q(w,tp.Create(w.X-20,w.Y),a[6][0],a[6][1],i);
  d(9,c.X,a[2][1].Y,w,tp.Create(c.X+(c.X-w.X),w.Y));
  FB.Clear(clPurple32);
  FB.PenColor := clBlack32;
  fb.Canvas.Brush.Style:=bsClear;
  FB.Canvas.Ellipse(off,off,500+off,500+off);
  for I := 1 to 9 do
  begin
    p1:=a[i][0];
    w:=a[i][1];
    v:=a[i][2];
    FB.Line(p1.X,p1.Y,w.X,w.Y, fb.PenColor);
    FB.Line(p1.X,p1.Y,v.X,v.Y,fb.PenColor);
    FB.Line(v.X,v.Y,w.X,w.Y,fb.PenColor);
  end;
  FB.Canvas.Brush.Color := clYellow;
  FB.Canvas.FloodFill(c.X,c.Y,clBlack32, fsBorder);
end;
end.

ผลลัพธ์จนถึงตอนนี้: (ใช่ฉันรู้ว่าบรรทัดไม่สมบูรณ์ในทุกที่ไม่พบปัญหา :() ป้อนคำอธิบายรูปภาพที่นี่
ไม่ทราบว่าทำไม แต่สามเหลี่ยมไม่แสดงโครงร่างของพวกเขาพวกเขาทำ bmp ที่บันทึกไว้ของฉัน


มีการอัพเดตอะไรบ้าง?
เทย์เลอร์สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.