How to draw a fish?

enter image description here

Asymptote version:

// fish.asy
//
settings.outformat="pdf";
real w=600,h=400; size(h,w);
pen bgPen=rgb(0,0.647,1),
bodyPen=rgb(0.847,0.196,0.133),
whitePen=rgb(1,1,1),
eyePen=rgb(0.004,0.18,1),
mouthPen=rgb(1,1,1),
scalesPen=rgb(0.98,1,0)+12pt;
pair[][] bBody={
    {(454,270),(436,252),(443,251),},{(433,269),(424,286),(398,322),},
    {(361,352),(324,382),(276,405),},{(218,394),(160,382),(92,334),},
    {(55,295),(18,256),(12,226),},{(13,187),(14,149),(21,102),},
    {(65,66),(109,30),(189,3),},{(243,2),(296,1),(322,24),},
    {(348,46),(374,68),(398,89),},{(414,109),(430,129),(437,149),},
    {(450,143),(463,137),(481,105),},{(504,80),(526,55),(552,37),},
    {(568,40),(585,43),(592,66),},{(584,97),(576,128),(553,166),},
    {(542,181),(531,197),(531,189),},{(543,204),(555,218),(579,256),},
    {(585,286),(591,316),(578,339),},{(571,349),(563,359),(561,356),},
    {(538,338),(515,320),(472,287),},
};
pair[][] bWhite={
    {(223,261),(227,278),(209,303),},{(192,312),(174,321),(156,315),},
    {(141,304),(127,293),(115,276),},{(116,260),(118,244),(132,228),},
    {(143,222),(155,215),(162,220),},{(179,227),(195,234),(220,244),},
};
pair[][] bEye={
    {(177,256),(180,264),(177,272),},{(171,276),(164,280),(154,279),},
    {(146,276),(139,272),(135,265),},{(136,258),(138,250),(146,241),},
    {(155,241),(163,240),(173,248),},
};
pair[][] bMouth={
    {(143,104),(122,94),(95,92),},
    {(83,86),(71,81),(75,71),},
    {(81,68),(87,65),(96,69),},
    {(105,68),(115,67),(126,62),},
    {(145,74),(165,87),(194,117),},
    {(204,133),(213,150),(204,152),},
    {(192,143),(179,135),(165,115),},
};
pair[][] aScales={
    {(221,370),(236,366),(257,360),(274,346),(292,337),(310,322),(315,305),(317,292),(312,275),
        (301,264),(307,249),(319,241),(331,229),(340,222),(350,210),(352,194),(347,176),(338,163),
        (335,151),(326,144),(319,141),(307,139),(312,123),(318,110),(322,93),(322,79),(321,63),(315,56),(297,46),(288,44),},
    {(387,115),(393,123),(397,139),(399,153),(394,174),(393,180),(401,203),(403,223),(390,243),
        (373,257),(383,268),(384,281),(379,300),(360,330),(328,354),(319,359),},
    {(465,153),(472,171),(460,182),(461,195),(469,204),(470,219),(460,231),(446,237),(432,242),},
    {(513,111),(520,120),(522,131),(515,143),(507,153),(511,164),(515,174),(510,187),
        (509,205),(511,219),(509,233),(517,243),(521,251),(519,265),(512,280),(507,288),},
    {(547,68),(556,73),(559,83),(559,94),(562,106),(563,112),},
    {(574,286),(567,291),(562,297),(557,301),(563,304),(564,313),(554,318),(546,323),},
};
pen[] penList={bodyPen, whitePen, eyePen, mouthPen};
pair[][][] pointList={bBody, bWhite, bEye, bMouth};
guide buildBguide(pair[][] aPoints){
    int n=aPoints.length;  guide g=aPoints[0][0]; 
    for(int i=0;i<n-1;++i){
        g=g..controls aPoints[i][1] and aPoints[i][2]..aPoints[i+1][0]; 
    }
    return g..controls aPoints[n-1][1] and aPoints[n-1][2]..cycle; 
};
guide buildGuide(pair[] aPoints){
    guide g; for(int i=0;i<aPoints.length;++i)g=g..aPoints[i]; 
    return g;
};
fill(box(0,(w-1,h-1)),bgPen);
for(int i=0;i<pointList.length;++i){
    fill(buildBguide(pointList[i]),penList[i]);
}
for(int i=0;i<aScales.length;++i){
    draw(buildGuide(aScales[i]),scalesPen);
}

Run asy fish to get fish.pdf.

* Edit: * enter image description here

Just for a little bit more fun, with minimal touch:

// fish.asy
//
settings.outformat="pdf";
real w=600,h=400; size(h,w);
pen bgPen=rgb(0,0.647,1),
bodyPen=rgb(0.847,0.196,0.133),
whitePen=rgb(1,1,1),
eyePen=rgb(0.004,0.18,1)+opacity(0.01),
mouthPen=rgb(1,1,1),
scalesPen=rgb(0.98,1,0)+12pt;
pair[][] bBody={
    {(454,270),(436,252),(443,251),},{(433,269),(424,286),(398,322),},
    {(361,352),(324,382),(276,405),},{(218,394),(160,382),(92,334),},
    {(55,295),(18,256),(12,226),},{(13,187),(14,149),(21,102),},
    {(65,66),(109,30),(189,3),},{(243,2),(296,1),(322,24),},
    {(348,46),(374,68),(398,89),},{(414,109),(430,129),(437,149),},
    {(450,143),(463,137),(481,105),},{(504,80),(526,55),(552,37),},
    {(568,40),(585,43),(592,66),},{(584,97),(576,128),(553,166),},
    {(542,181),(531,197),(531,189),},{(543,204),(555,218),(579,256),},
    {(585,286),(591,316),(578,339),},{(571,349),(563,359),(561,356),},
    {(538,338),(515,320),(472,287),},
};
pair[][] bWhite={
    {(223,261),(227,278),(209,303),},{(192,312),(174,321),(156,315),},
    {(141,304),(127,293),(115,276),},{(116,260),(118,244),(132,228),},
    {(143,222),(155,215),(162,220),},{(179,227),(195,234),(220,244),},
};
pair[][] bEye={
    {(177,256),(180,264),(177,272),},{(171,276),(164,280),(154,279),},
    {(146,276),(139,272),(135,265),},{(136,258),(138,250),(146,241),},
    {(155,241),(163,240),(173,248),},
};
pair[][] bMouth={
    {(143,104),(122,94),(95,92),},
    {(83,86),(71,81),(75,71),},
    {(81,68),(87,65),(96,69),},
    {(105,68),(115,67),(126,62),},
    {(145,74),(165,87),(194,117),},
    {(204,133),(213,150),(204,152),},
    {(192,143),(179,135),(165,115),},
};
pair[][] aScales={
    {(221,370),(236,366),(257,360),(274,346),(292,337),(310,322),(315,305),(317,292),(312,275),
        (301,264),(307,249),(319,241),(331,229),(340,222),(350,210),(352,194),(347,176),(338,163),
        (335,151),(326,144),(319,141),(307,139),(312,123),(318,110),(322,93),(322,79),(321,63),(315,56),(297,46),(288,44),},
    {(387,115),(393,123),(397,139),(399,153),(394,174),(393,180),(401,203),(403,223),(390,243),
        (373,257),(383,268),(384,281),(379,300),(360,330),(328,354),(319,359),},
    {(465,153),(472,171),(460,182),(461,195),(469,204),(470,219),(460,231),(446,237),(432,242),},
    {(513,111),(520,120),(522,131),(515,143),(507,153),(511,164),(515,174),(510,187),
        (509,205),(511,219),(509,233),(517,243),(521,251),(519,265),(512,280),(507,288),},
    {(547,68),(556,73),(559,83),(559,94),(562,106),(563,112),},
    {(574,286),(567,291),(562,297),(557,301),(563,304),(564,313),(554,318),(546,323),},
};
guide buildBguide(pair[][] aPoints){
    int n=aPoints.length;  guide g=aPoints[0][0]; 
    for(int i=0;i<n-1;++i){
        g=g..controls aPoints[i][1] and aPoints[i][2]..aPoints[i+1][0]; 
    }
    return g..controls aPoints[n-1][1] and aPoints[n-1][2]..cycle; 
};
guide buildGuide(pair[] aPoints){
    guide g; for(int i=0;i<aPoints.length;++i)g=g..aPoints[i]; 
    return g;
};
axialshade(box(0,(w-1,h-1)),deepblue,(0,3),palegreen,(0,600));
axialshade(buildBguide(bBody),paleyellow+opacity(0.6),(0,3),deepred,(0,200));

guide gWhite=buildBguide(bWhite);
guide gEye=buildBguide(bEye);
pair whiteCenter=(max(gWhite)+min(gWhite))/2;
pair eyeCenter=(max(gEye)+min(gEye))/2;
radialshade(gWhite,white,whiteCenter,20, orange,whiteCenter,60);
radialshade(gEye,black,eyeCenter,6, deepgreen,eyeCenter,20);
fill(buildBguide(bMouth),mouthPen);

for(int i=0;i<aScales.length;++i){
    draw(buildGuide(aScales[i]),scalesPen);
}

int n=99;  real llen=20,s;
pair lpoint,ldir;
for(int i=0;i<n;++i){
    s=i/(n-2);
    lpoint=relpoint(gWhite,s);
    ldir=rotate(90)*reldir(gWhite,s);
    draw(lpoint--(lpoint+llen*sin(2*pi*s)*ldir),black);
}

* Edit-3d *

More fun, this time in 3d:

enter image description here

// fish3d.asy
//
real w=8cm,h=0.618w;
size(h,w);

import solids;
currentprojection=orthographic(
camera=(-230,60,133),up=three.Y,target=(5,21,2),zoom=0.8);
currentlight=White;

include "fish3d05.asy";

material m_Skin=material(diffusepen=gray(0), emissivepen=rgb(0.8,0,0), specularpen=gray(1),    shininess=0.15);
material m_eyeW=material(diffusepen=gray(0.001), emissivepen=gray(0.45), specularpen=gray(0.9),shininess=0.15);
material m_eyeB=material(diffusepen=gray(0.001), emissivepen=gray(0.01), specularpen=gray(0.9),shininess=0.15);

draw(surface(P),m_Skin);

triple c0=(-42,42,0);
triple c1=(-42,42,-20);
triple c2=(-42,42,22);

real R=10, r=3;
draw(surface(sphere(c1,R)),surfacepen=m_eyeW);
draw(surface(sphere(c2,R)),surfacepen=m_eyeW);

draw(surface(rotate(70,c1-(0,1,0),c1+(0,1,0))*sphere(c1-(R-r*0.62)*(three.Z),r)) ,m_eyeB);
draw(surface(rotate(-60,c2-(0,1,0),c2+(0,1,0))*sphere(c2+(R-r*0.62)*(three.Z),r)),m_eyeB);

And the shape in fish3d05.asy file:

// fish3d05.asy

triple[][][] P={
{{(-77,42,0),(-78,42,7),(-71,37,14),(-68,22,14)},
{(-98,26,0),(-98,27,7),(-91,29,7),(-89,13,7)},
{(-119,20,0),(-119,20,1),(-115,13,5),(-113,7,5)},
{(-87,18,0),(-87,18,1),(-85,13,2),(-83,7,2)},
},{
{(-16,75,0),(-16,74,14),(-11,65,29),(-9,37,30)},
{(-38,80,0),(-38,80,14),(-31,67,31),(-30,39,31)},
{(-57,57,0),(-58,58,7),(-50,45,20),(-47,30,20)},
{(-77,42,0),(-78,42,7),(-71,37,14),(-68,22,14)},
},{
{(49,26,0),(50,26,5),(51,24,9),(51,20,9)},
{(33,34,0),(34,34,5),(35,25,14),(36,22,14)},
{(7,69,0),(7,69,14),(10,63,27),(12,35,28)},
{(-16,75,0),(-16,74,14),(-11,65,29),(-9,37,30)},
},{
{(80,39,-1),(80,39,4),(84,43,9),(83,30,9)},
{(71,36,-1),(71,36,4),(75,41,10),(75,28,10)},
{(65,17,0),(66,17,5),(67,22,5),(67,18,5)},
{(49,26,0),(50,26,5),(51,24,9),(51,20,9)},
},{
{(65,26,0),(66,26,0),(66,23,0),(66,20,0)},
{(101,33,0),(102,33,0),(102,29,2),(102,26,2)},
{(89,43,-1),(89,43,4),(92,46,8),(92,32,8)},
{(80,39,-1),(80,39,4),(84,43,9),(83,30,9)},
},{
{(-87,18,0),(-87,18,1),(-85,13,2),(-83,7,2)},
{(-55,16,0),(-55,16,1),(-56,13,0),(-54,7,0)},
{(29,19,0),(30,19,0),(29,16,-2),(29,14,-2)},
{(65,26,0),(66,26,0),(66,23,0),(66,20,0)},
},{
{(-68,22,14),(-65,6,14),(-67,-20,7),(-67,-21,0)},
{(-89,13,7),(-86,-2,7),(-87,-12,6),(-86,-13,-1)},
{(-113,7,5),(-111,0,5),(-108,-14,1),(-108,-15,0)},
{(-83,7,2),(-81,1,2),(-79,-6,1),(-79,-7,0)},
},{
{(-9,37,30),(-8,9,30),(-10,-39,16),(-10,-38,2)},
{(-30,39,31),(-28,11,32),(-31,-47,16),(-30,-47,2)},
{(-47,30,20),(-45,14,20),(-48,-28,7),(-47,-29,1)},
{(-68,22,14),(-65,6,14),(-67,-20,7),(-67,-21,0)},
},{
{(51,20,9),(52,16,9),(51,10,5),(50,10,0)},
{(36,22,14),(36,18,14),(36,6,5),(35,6,1)},
{(12,35,28),(13,7,28),(10,-30,16),(11,-30,2)},
{(-9,37,30),(-8,9,30),(-10,-39,16),(-10,-38,2)},
},{
{(83,30,9),(83,16,9),(79,-14,5),(79,-14,0)},
{(75,28,10),(74,14,10),(71,-14,5),(71,-14,0)},
{(67,18,5),(67,14,5),(66,14,4),(65,14,-1)},
{(51,20,9),(52,16,9),(51,10,5),(50,10,0)},
},{
{(66,20,0),(66,18,0),(65,15,0),(65,16,0)},
{(102,26,2),(102,24,2),(100,11,0),(99,12,0)},
{(92,32,8),(92,19,9),(88,-15,5),(88,-15,0)},
{(83,30,9),(83,16,9),(79,-14,5),(79,-14,0)},
},{
{(-83,7,2),(-81,1,2),(-79,-6,1),(-79,-7,0)},
{(-54,7,0),(-52,1,0),(-50,2,2),(-50,1,0)},
{(29,14,-2),(29,11,-2),(31,19,0),(31,20,0)},
{(66,20,0),(66,18,0),(65,15,0),(65,16,0)},
},{
{(-67,-21,0),(-66,-22,-7),(-63,3,-14),(-66,18,-14)},
{(-86,-13,-1),(-85,-14,-8),(-84,-7,-9),(-87,9,-9)},
{(-108,-15,0),(-108,-16,-2),(-110,-3,-6),(-112,3,-6)},
{(-79,-7,0),(-79,-8,-1),(-81,-2,-3),(-83,4,-3)},
},{
{(-10,-38,2),(-10,-38,-12),(-7,11,-25),(-8,39,-25)},
{(-30,-47,2),(-30,-47,-12),(-26,12,-26),(-27,40,-27)},
{(-47,-29,1),(-47,-30,-6),(-42,12,-19),(-44,28,-19)},
{(-67,-21,0),(-66,-22,-7),(-63,3,-14),(-66,18,-14)},
},{
{(50,10,0),(49,10,-5),(49,16,-10),(49,20,-10)},
{(35,6,1),(34,6,-4),(33,18,-13),(33,22,-13)},
{(11,-30,2),(11,-29,-12),(13,9,-23),(11,37,-24)},
{(-10,-38,2),(-10,-38,-12),(-7,11,-25),(-8,39,-25)},
},{
{(79,-14,0),(79,-14,-5),(83,16,-10),(83,30,-10)},
{(71,-14,0),(70,-14,-5),(73,14,-11),(74,27,-11)},
{(65,14,-1),(64,14,-5),(64,13,-7),(64,17,-7)},
{(50,10,0),(49,10,-5),(49,16,-10),(49,20,-10)},
},{
{(65,16,0),(65,16,0),(65,18,0),(65,20,0)},
{(99,12,0),(99,12,0),(102,25,-2),(102,27,-2)},
{(88,-15,0),(88,-15,-5),(92,19,-9),(92,32,-9)},
{(79,-14,0),(79,-14,-5),(83,16,-10),(83,30,-10)},
},{
{(-79,-7,0),(-79,-8,-1),(-81,-2,-3),(-83,4,-3)},
{(-50,1,0),(-50,0,-1),(-52,-1,0),(-54,5,0)},
{(31,20,0),(31,20,0),(28,11,2),(28,14,2)},
{(65,16,0),(65,16,0),(65,18,0),(65,20,0)},
},{
{(-66,18,-14),(-68,34,-14),(-77,41,-7),(-77,42,0)},
{(-87,9,-9),(-89,25,-9),(-97,26,-7),(-98,26,0)},
{(-112,3,-6),(-114,9,-6),(-119,19,-1),(-119,20,0)},
{(-83,4,-3),(-85,10,-3),(-87,17,-1),(-87,18,0)},
},{
{(-8,39,-25),(-10,67,-26),(-15,75,-14),(-16,75,0)},
{(-27,40,-27),(-29,68,-27),(-38,81,-14),(-38,80,0)},
{(-44,28,-19),(-47,43,-19),(-57,56,-7),(-57,57,0)},
{(-66,18,-14),(-68,34,-14),(-77,41,-7),(-77,42,0)},
},{
{(49,20,-10),(48,24,-10),(49,26,-5),(49,26,0)},
{(33,22,-13),(33,26,-13),(33,34,-5),(33,34,0)},
{(11,37,-24),(10,66,-24),(7,69,-14),(7,69,0)},
{(-8,39,-25),(-10,67,-26),(-15,75,-14),(-16,75,0)},
},{
{(83,30,-10),(83,43,-10),(80,39,-5),(80,39,-1)},
{(74,27,-11),(74,41,-11),(71,36,-5),(71,36,-1)},
{(64,17,-7),(64,21,-7),(64,17,-5),(65,17,0)},
{(49,20,-10),(48,24,-10),(49,26,-5),(49,26,0)},
},{
{(65,20,0),(65,23,0),(65,26,0),(65,26,0)},
{(102,27,-2),(102,30,-2),(101,33,0),(101,33,0)},
{(92,32,-9),(93,46,-9),(89,43,-5),(89,43,-1)},
{(83,30,-10),(83,43,-10),(80,39,-5),(80,39,-1)},
},{
{(-83,4,-3),(-85,10,-3),(-87,17,-1),(-87,18,0)},
{(-54,5,0),(-56,11,0),(-55,15,-1),(-55,16,0)},
{(28,14,2),(28,16,2),(29,19,0),(29,19,0)},
{(65,20,0),(65,23,0),(65,26,0),(65,26,0)},
}};

\documentclass{article}
\usepackage{tikz,stackengine}

\begin{document}
\savestack\fish{%
    \begin{tikzpicture}
        \draw[fill=blue] (.5,0) rectangle (4,2);
        \draw[fill=red] (1,1) to[bend left=50] (3,1) to[bend left=50] (1,1);
        \draw[fill=red] (3,1) -- (3.5,1.5) -- (3.3,1) -- (3.5,.5) -- cycle;
        \draw[fill=white] (1.6,1.1) circle (.15cm); 
        \draw[fill=blue] (1.55,1.1) circle (.05cm);         
    \end{tikzpicture}
}
\color{yellow}%
  \stackinset{c}{-2em}{c}{-.75em}{%
    \rotatebox{-150}{\scalebox{1}[.5]{\textcolor{white}{$\frown$}}}}{%
  \stackinset{c}{}{c}{}{%
    \scalebox{.7}{\rotatebox{-90}{$\frown\!\frown\!\frown$}}}{%
  \stackinset{c}{.7em}{c}{}{%
    \scalebox{.7}[.5]{\rotatebox{-90}{$\frown\!\frown\!\frown$}}}{%
  \stackinset{c}{1.3em}{c}{}{%
    \scalebox{.5}[.3]{\rotatebox{-90}{$\frown\!\frown\!\frown$}}}{%
  \stackinset{c}{2.6em}{c}{}{%
    \scalebox{.4}[.3]{\rotatebox{-90}{$\frown~\frown$}}}{%
  \stackinset{c}{2.9em}{c}{}{%
    \scalebox{.3}[.3]{\rotatebox{-90}{$\frown~~~~~~~~\frown$}}}{%
  \fish}}}}}}
\end{document}

enter image description here


A couple of hours late:

\documentclass{article}
\usepackage{lmodern,graphicx,color}
\def\familydefault{\sfdefault}
\def\seriesdefault{\bfdefault}
\def\chihapaura#1#2?{\color{\ifcase#1red\or yellow\or blue\fi}%
       \fontsize{#2\unitlength}{0pt}\selectfont}
\begin{document}
\begin{picture}(50,50)
  \put(46,18) {\chihapaura112?E}
  \put(38,15) {\chihapaura020?C}
  \put(29,5)  {\chihapaura121?\scalebox1[2.5]{S}}
  \put(0,0)   {\chihapaura0100?$\epsilon$}
  \put(7,20)  {\chihapaura230?\rotatebox{-24}{p}}
\end{picture}%(d'aprile)
\end{document}

d'aprile

Tags:

Fun