for e1,e2 in zip( expand.ordered_edgeloop(loop[l]),
expand.ordered_edgeloop(eloop)):
f1=(e1.v1.index,e1.v2.index,
e2.v2.index,e2.v1.index)
f2=(e1.v2.index,e1.v1.index,
e2.v2.index,e2.v1.index)
faces.append(least_warped(me,f1,f2))
me.faces.extend(faces)
ΠΡ ΠΎΠΏΡΡΡΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π²ΡΠ΄Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΡ ΡΡΠ±Π΅ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°, Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π»ΡΠ½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΠΊΠ°ΠΊ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ±Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ». Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π²ΡΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΡΠ±ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π²Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (ΡΡΠΎ - Π²ΡΠ΄Π°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ±ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²). ΠΠ°ΡΠ΅ΠΌ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ fill(). ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ Π»ΡΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ Π·Π°ΠΌΠΊΠ½ΡΡΡΡ ΡΡΠ±Π΅ΡΠ½ΡΡ ΡΠΈΠΊΠ»ΠΎΠ² Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Ρ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ. ΠΠ½ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡ ΠΎΠ± ΠΎΡΠ²Π΅ΡΡΡΠΈΡΡ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌΡ ΠΎΡΡΡΠΎΠ²Ρ Π² Π±ΡΠΊΠ²Π΅ e):
deselect_all_edges(me)
select_edges(me,'TextBottom')
me.fill()
ΠΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ cartouche - ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠΏΡΠΎΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ±Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Π²ΠΎΠΊΡΡΠ³ Π½Π°ΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΡΠ±Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» Π²ΡΠ±ΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π²Π΅ΡΡΠΈΠ½Π°ΠΌΠΈ Π² Π³ΡΡΠΏΠΏΠ΅ Π²Π΅ΡΡΠΈΠ½ Outline, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ½ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ fill() Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ cartouche. ΠΡΠΎ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π·Π΄Π΅ΡΡ. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΡΠΈΡ ΠΎΠ²: ΠΌΡ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΠΌΠ΅ΡΠ΅ Π² ΡΠ΅ΡΡΡΠ΅Ρ ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄ triangleToQuad(), Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠ΅Ρ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ subsurface, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π°ΡΡΠΈΠ±ΡΡ ΡΠ³Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΡ (smooth) Π½Π° Π²ΡΠ΅Ρ Π³ΡΠ°Π½ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ Π½ΠΎΡΠΌΠ°Π»ΠΈ Π²ΡΠ΅Ρ Π³ΡΠ°Π½Π΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ Π½Π°ΡΡΠΆΡ.
me.triangleToQuad()
me.subdivide()
mod = ob.modifiers.append(
Blender.Modifier.Types.SUBSURF)
mod[Blender.Modifier.Settings.LEVELS]=2
select_all_faces(me)
set_smooth(me)
select_all_edges(me)
me.recalcNormals()
Π‘ΠΊΡΡΡΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΠ°Ρ Π²Π°ΡΠ°:
ΠΡ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π² ΠΠ»Π΅Π½Π΄Π΅ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΠΠΈΡΠΎΠ½Π΅. ΠΡΡΡ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½, Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ° Π² Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΠ»Π΅Π½Π΄Π΅ΡΠ°. ΠΡΠΎ - ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ Hook (ΠΠ°Ρ Π²Π°Ρ). ΠΠ°Ρ Π²Π°Ρ Π² ΠΠ»Π΅Π½Π΄Π΅ΡΠ΅ - ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ Π²Π΅ΡΡΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ (ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ vertex parenting, Π³Π΄Π΅ ΠΌΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌ Π²Π΅ΡΡΠΈΠ½Ρ), ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Π½Ρ Mesh | Vertex | Add Hook Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ½ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ². Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΠ°Ρ Π²Π°ΡΠ° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ², Π½ΠΎ ΡΠ²Ρ, Π½ΠΈ Π΅Π³ΠΎ ΡΠΈΠΏ, Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Ρ Π² API.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ° ΠΊ ΡΠ°Π·Π΄Π΅Π»Ρ ΠΡΠ°Π²ΠΈΡΠΎΠ²ΠΊΠ°:
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π½Π½Π°Ρ ΠΌΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° engrave.py (Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ Π΅ΠΉ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ expand.py), ΡΠΊΠ°ΡΠ°Π½Π½Π°Ρ Ρ ΡΠ°ΠΉΡΠ° ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²Π°, ΡΠ°Π±ΠΎΡΠ°Π»Π° Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΠ°ΠΊ ΠΊΡΠ°ΡΠΈΠ²ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅. Π ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· ΠΏΡΠΈΠ΄ΡΡΡΡ Π½Π°Π±ΡΠ°ΡΡΡΡ Π½Π°Π³Π»ΠΎΡΡΠΈ ΠΈ ΡΠΊΠ°Π·Π°ΡΡ Π½Π° Π½Π΅Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ Π°Π²ΡΠΎΡΠ°.
1. ΠΡΠΎΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅: Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½ΡΡ Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ:
me.subdivide()
me.triangleToQuad()
me.subdivide()
ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² ΡΠ΅ΡΡΡΡΡ ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ, ΠΈ ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ, Π° ΠΊ ΡΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΎΠ½ΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½Ρ Π²ΡΠ΅, ΠΊΡΠΎΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΠ° Π±ΡΠΊΠ². Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, ΠΌΠ΅Ρ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π° ΡΡΡΡΠ°ΡΠ°ΡΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π»ΠΈΡΠ½ΠΈΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ². Π― Π·Π°ΠΌΠ΅Π½ΠΈΠ» ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ±ΠΎΡ Π²ΡΠ΅Ρ ΡΡΠ±Π΅Ρ.
select_all_edges(me)
me.triangleToQuad()
me.subdivide()
2. Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠΊΠ°Π½ΡΠΎΠ²ΠΊΠ° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»Π° Π²Π½ΡΡΡΡ, Π° Π½Π΅ Π½Π°ΡΡΠΆΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ, Ρ.Π΅. ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΊΠΎΠ½ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ, Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π»Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ in_polygon() ΠΌΠΎΠ΄ΡΠ»Ρ expand:
if cross(p,vec(1.0,0.0,0.0),polygon[i].co,
polygon[(i+1)%n].co):
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΡΠ», Π²ΡΠΎΡΠΎΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΠΎΠ³ΠΎ Π»ΡΡΠ° vec(1.0,0.0,0.0) Π²Π·ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎ, ΠΈ ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π½Π°ΠΊΠ»Π°Π΄ΠΊΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ . ΠΠ»Ρ ΡΠ΅Π±Ρ Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΠ» Π±ΠΎΠ»Π΅Π΅ ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ vec(1000.0,0.0,0.0), ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΠΌΠΎΡΠΌ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»Π° ΠΎΡΠΈΠ±Π°ΡΡΡΡ. Π ΠΎΠ±ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°ΠΌΠ° ΠΏΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ Π²ΡΡΠΈΡΠ»ΡΡΡ ΡΡΠΎΡ Π²Π΅ΠΊΡΠΎΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
3. Π‘Π°ΠΌΠΎΠ΅ ΡΡΡΠ°ΡΠ½ΠΎΠ΅: Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΌΠ΅ΠΆΠ΄Ρ Π±ΡΠΊΠ²Π°ΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΡΠ»ΠΎΠ²ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fill() (Π΅Ρ Π°Π½Π°Π»ΠΎΠ³ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΠ»Π΅Π½Π΄Π΅ΡΠ° - Shift-F), ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Ρ ΠΎΡΠ΅Π½Ρ ΠΎΡΡΡΡΠΌΠΈ ΡΠ³Π»Π°ΠΌΠΈ. Π‘ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΡΠΏΠ΅Ρ ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΡΠ°Π·Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π±ΡΠ»Π΅Π°Π½ΠΎΠ²ΡΠΊΠΎΠ΅ Π²ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ Π½Π΅ ΠΌΡΡΠΈΡΡΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΡΠ°ΡΠΈΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ, Π½ΠΎ, Π΄ΡΠΌΠ°Ρ, ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠ΄-Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ.
ΠΡΠΊΡΡ ΠΈ Π²ΡΠ΅ ΡΡΠΊΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°ΡΡΠΈΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π΅ΡΠΎΠ² Π² Π³ΡΡΠΏΠΏΠ΅ Π²Π΅ΡΡΠΈΠ½, Π²ΠΊΠ»ΡΡΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ ΠΈΡΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ ΡΠ°ΡΡΠΈΡ.
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΊΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ΅Π½ΠΎΠΌΠ΅Π½Π°, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ "ΠΠ³Π½ΠΈ ΡΠ²ΡΡΠΎΠ³ΠΎ ΠΠ»ΡΠΌΠ°". ΠΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Π°Ρ , ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² Π½Π°ΡΠ°Π»Π΅ Π³ΡΠΎΠ·Ρ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π°ΡΠΈΠ½Π°ΡΡ ΡΠ²Π΅ΡΠΈΡΡΡΡ. ΠΡΠΎ ΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΡΠΎΠ½Π½ΡΠΉ ΡΠ°Π·ΡΡΠ΄ (ΡΠΌ., Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, http://ru.wikipedia.org/wiki/ΠΠ³Π½ΠΈ_ΡΠ²ΡΡΠΎΠ³ΠΎ_ΠΠ»ΡΠΌΠ°), ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π½Π° ΠΎΡΡΡΡΡ ΠΈ Π²ΡΡΡΡΠΏΠ°ΡΡΠΈΡ ΡΠ°ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΡΠΏΠ½ΡΡ ΡΡΡΡΠΊΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ°Π΄ΠΈΠΎΠ°Π½ΡΠ΅Π½Π½Π°Ρ ΠΈΠ»ΠΈ Π³ΡΠΎΠΌΠΎΠΎΡΠ²ΠΎΠ΄Π°Ρ , Π³Π΄Π΅ ΡΠ»Π΅ΠΊΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠΎΡ ΡΡΡΠ΅ΠΊΡ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΈΠ»ΡΠ½ΠΎΠ΅.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π²Π»ΠΈΡΡΡ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΡΡΠΈΡ, ΠΈΡΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ ΠΌΠ΅ΡΠ΅ΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΡΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΊΡΠΈΠ²ΠΈΠ·Π½Π°, ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ, Π½ΡΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΡΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ, ΠΊΠ°ΠΊ Π²Π΅Ρ Π² Π³ΡΡΠΏΠΏΠ΅ Π²Π΅ΡΡΠΈΠ½. ΠΠ°ΡΠ΅ΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ Π³ΡΡΠΏΠΏΡ Π²Π΅ΡΡΠΈΠ½ ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠ°ΡΡΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΌΠΈΡΡΠΈΠ΅ΠΉ.
ΠΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π»ΡΠ±ΡΡ ΡΠΎΡΠΌΡ, ΠΈ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π½Π΅Ρ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΡΠΎΡΠΌΡΠ»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±Ρ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΠΎΠ²Π°Π»Π° Π΅Π³ΠΎ ΡΠΎΡΠΌΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΡ Π°ΠΏΠΏΡΠΎΠΊΡΠΈΠΌΠΈΡΡΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π³ΡΡΠ±ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΆΠ΅Π»ΠΎΠΉ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ, ΡΠΌΠΎΡΡΠΈΡΠ΅ http://en.wikipedia.org/wiki/Mean_curvature), Π²ΡΡΠΈΡΠ»ΡΡ ΡΡΠ΅Π΄Π½ΡΡ ΡΡΠ±Π΅ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ Π²ΡΠ΅Ρ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π²Π΅ΡΡΠΈΠ½ΠΎΠΉ ΡΡΠ±Π΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π² ΠΌΠ΅ΡΠ΅. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΡΠ±Π΅ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ ΠΊΠ°ΠΊ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡΠΌΠ°Π»ΠΈ ΠΈ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠ΅Π±ΡΠ° (ΡΠΎ Π΅ΡΡΡ, Π²Π΅ΠΊΡΠΎΡ, ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΡ Π²Π΅ΡΡΠΈΠ½Ρ ΠΊ Π΅Ρ ΡΠΎΡΠ΅Π΄ΠΊΠ΅). ΠΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΡΠ΅Π±ΡΠΎ ΠΈΠ·Π³ΠΈΠ±Π°Π΅ΡΡΡ Π²Π½ΠΈΠ· ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΠΎΡΠΌΠ°Π»ΠΈ, ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΈΠ·Π³ΠΈΠ±Π°Π΅ΡΡΡ Π²Π²Π΅ΡΡ . ΠΡ ΠΎΠ±ΡΠ°ΡΠΈΠΌ ΡΡΠΎΡ Π·Π½Π°ΠΊ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠ²ΡΡΠ½ΠΎ ΠΏΠΎΠ½ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ Π΄Π»Ρ ΠΏΠΈΠΊΠΎΠ², Π° Π½Π΅ Π΄Π»Ρ Π²ΠΏΠ°Π΄ΠΈΠ½. ΠΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΡΠΎ ΡΠ°ΠΊ: Π² ΠΎΠ±Π»Π°ΡΡΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ ΡΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρ Π²Π΅ΡΡΠΈΠ½Π½ΠΎΠΉ Π½ΠΎΡΠΌΠ°Π»ΡΡ ΠΈ ΡΠ΅Π±ΡΠΎΠΌ, Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅ΠΌΡΡ Π² ΡΠΎΠΉ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠ½Π΅, Π±ΠΎΠ»ΡΡΠ΅ 90Β°.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΡΡΠ½ΠΎΠΊ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ - ΠΎΠ½ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅ΡΠΈΡ Π²Π΅ΡΡΠΈΠ½, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΡΠ±ΡΠ°ΠΌΠΈ. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠ½Π½Π°Ρ Π½ΠΎΡΠΌΠ°Π»Ρ (ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ). ΠΠ΅ΡΡΠΈΠ½Ρ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ a, ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ, ΡΠ΅, ΡΡΠΎ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Ρ b - ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ. ΠΠ²Π΅ ΠΈΠ· ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΠ½ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π±ΡΠΊΠ²ΠΎΠΉ c, ΠΎΠ½ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ - Π² ΡΡΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΏΠ»ΠΎΡΠΊΠ°Ρ, ΠΈ Π²Π΅ΡΡΠΈΠ½Π½Π°Ρ Π½ΠΎΡΠΌΠ°Π»Ρ ΠΏΠ΅ΡΠΏΠ΅Π½Π΄ΠΈΠΊΡΠ»ΡΡΠ½Π° ΡΡΠ±ΡΠ°ΠΌ.
Π Π°ΡΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ
Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΡΠΈΠ²ΠΈΠ·Π½Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π² ΠΌΠ΅ΡΠ΅, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
from collections import defaultdict
def localcurvature(me,positive=False):
end=defaultdict(list)
for e in me.edges:
end[e.v1.index].append(e.v2)
end[e.v2.index].append(e.v1)
weights=[]
for v1 in me.verts:
dvdn = []
for v2 in end[v1.index]:
dv = v1.co-v2.co
dvdn.append(dv.dot(v1.no.normalize()))
weights.append((v1.index,sum(dvdn)/max(len(dvdn),
1.0)))
if positive:
weights = [(v,max(0.0,w)) for v,w in weights]
minimum = min(w for v,w in weights)
maximum = max(w for v,w in weights)
span = maximum - minimum
if span > 1e-9:
return [(v,(w-minimum)/span) for v,w in weights]
return weights
Π€ΡΠ½ΠΊΡΠΈΡ localcurvature() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ΅Ρ ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΉ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ Π²Π΅ΡΡΠΈΠ½Ρ ΠΈ Π΅Ρ Π²Π΅ΡΠΎΠΌ. ΠΡΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ - ΠΡΡΠΈΠ½Π°, Π»ΡΠ±ΠΎΠΉ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ³Π°Π΅ΡΡΡ.