TransWikia.com

Animated filling of a font character

TeX - LaTeX Asked on March 21, 2021

Is there a way to fill a sign, say the sign ‘ / ‘, with red in steps?

Because, I ask myself if I could create sth. like that, using the corresponding character from a matching font (in the picture U+3042 (12354)):

enter image description here

No MWE:

documentclass[margin=5mm]{standalone}
usepackage{tikz}
begin{document}
Animatetikz[scale=11, transform shape]node{/};
end{document}

One Answer

Finished.

import animate;

settings.tex="xelatex";
settings.outformat="pdf"; 
texpreamble("usepackage{CJK}
usepackage{fontspec}
setmainfont{Arial Unicode MS}
AtBeginDocument{begin{CJK*}{UTF8}{name}}
AtEndDocument{clearpageend{CJK*}}");
animation Ani;
unitsize(1cm);
path[] Asymptote=texpath("あ");
// pen[] p={red,green,blue};
/*
for (int i=0; i <Asymptote.length; ++i)
{
  draw(Asymptote[i],p[i]);
}
*/
pair[] a,b,c;
pair labdira,labdirb,labdirc;

  for(int j=0;j<size(Asymptote[0]);++j){
    a.push(point(Asymptote[0],j));
  }
    for(int j=0;j<size(Asymptote[1]);++j){
    b.push(point(Asymptote[1],j));
  }
    for(int j=0;j<size(Asymptote[2]);++j){
    c.push(point(Asymptote[2],j));
  }

path p1=subpath(Asymptote[0],21,22)--subpath(Asymptote[0],25,26);
path p2=reverse(subpath(Asymptote[0],19,20))--reverse(subpath(Asymptote[0],27,28));
path firstpath;
for(real r=0; r<20; ++r){
save();
firstpath=reverse(subpath(p2,0,reltime(p2,r/20)))--subpath(Asymptote[0],20,21)--subpath(p1,0,reltime(p1,r/20))--cycle;
fill(firstpath, (r != 0) ? black : invisible);
Ani.add();
restore();
}
fill(reverse(subpath(p2,0,reltime(p2,1)))--subpath(Asymptote[0],20,21)--subpath(p1,0,reltime(p1,1))--cycle);

path q1=reverse(subpath(Asymptote[0],22,23))--reverse(subpath(Asymptote[0],18,19))
               --subpath(Asymptote[2],1,0)--reverse(subpath(Asymptote[0],12,13));
path q2=subpath(Asymptote[0],24,25)--subpath(Asymptote[0],28,29)
               --subpath(Asymptote[1],2,3)--subpath(Asymptote[0],10,11);
path secondpath;

for(real r=0; r<20; ++r){
save();
secondpath=reverse(subpath(q1,0,reltime(q1,r/20)))--subpath(Asymptote[0],23,24)--subpath(q2,0,reltime(q2,r/20))--cycle;
fill(secondpath,(r != 0) ? black : invisible);
Ani.add();
restore();
}
fill(reverse(subpath(q1,0,reltime(q1,1)))--subpath(Asymptote[0],23,24)--subpath(q2,0,reltime(q2,1))--cycle);

pair A=b[0]+2*dir(subpath(Asymptote[1],3,4));
pair B=a[9]+2*dir(reverse(subpath(Asymptote[0],9,10)));
pair Aa=intersectionpoint(subpath(Asymptote[0],1,2),b[0]--A);
pair Bb=intersectionpoint(subpath(Asymptote[0],1,2),a[9]--B);

path tr=subpath(Asymptote[1],4,3)--subpath(Asymptote[2],6,1)
                   --subpath(Asymptote[1],2,0)
                   --reverse(subpath(Asymptote[0],6,9));
path tr1=subpath(Asymptote[0],9,10)
                   --subpath(Asymptote[0],13,18)
                   --subpath(Asymptote[0],0,5);
path kk;
for (int i=0; i<=20; ++i){
save();
  kk=reverse(subpath(Aa--tr,0,reltime(Aa--tr,i/20)))--Aa--Bb--subpath(Bb--tr1,0,reltime(Bb--tr1,i/20))--cycle;
  fill(kk,(i != 0 ) ? black : invisible);
Ani.add();
restore();
}

erase();
Ani.movie(BBox(2mm,Fill(pink)));

enter image description here

Updated!

This is what you want!

Step 1:

settings.tex="xelatex";
settings.outformat="pdf"; 
texpreamble("usepackage{CJK}
usepackage{fontspec}
setmainfont{Arial Unicode MS}
AtBeginDocument{begin{CJK*}{UTF8}{name}}
AtEndDocument{clearpageend{CJK*}}");
unitsize(1cm);
path[] Asymptote=texpath("あ");
pen[] p={red,green,blue}; p.cyclic=true;

for (int i=0; i <Asymptote.length; ++i)
{
  draw(Asymptote[i],p[i]);
}

pair[] a,b,c;
pair labdira,labdirb,labdirc;

  for(int j=0;j<size(Asymptote[0]);++j){
    a.push(point(Asymptote[0],j));
    labdira=rotate(-90)*dir(Asymptote[0],j);
    dot("$scriptsize "+string(j)+"$",a[j],labdira);
  }
    for(int j=0;j<size(Asymptote[1]);++j){
    b.push(point(Asymptote[1],j));
    labdirb=rotate(-90)*dir(Asymptote[1],j);
    dot("$scriptsize "+string(j)+"$",b[j],labdirb);
  }
    for(int j=0;j<size(Asymptote[2]);++j){
    c.push(point(Asymptote[2],j));
    labdirc=rotate(-90)*dir(Asymptote[2],j);
    dot("$scriptsize "+string(j)+"$",c[j],labdirc);
  }

enter image description here

Step 2:

import animate;

settings.tex="xelatex";
settings.outformat="pdf"; 
texpreamble("usepackage{CJK}
usepackage{fontspec}
setmainfont{Arial Unicode MS}
AtBeginDocument{begin{CJK*}{UTF8}{name}}
AtEndDocument{clearpageend{CJK*}}");
animation Ani;
unitsize(1cm);
path[] Asymptote=texpath("あ");
pen[] p={red,green,blue};

for (int i=0; i <Asymptote.length; ++i)
{
  draw(Asymptote[i],p[i]);
}

pair[] a,b,c;
pair labdira,labdirb,labdirc;

  for(int j=0;j<size(Asymptote[0]);++j){
    a.push(point(Asymptote[0],j));
    /*labdira=rotate(-90)*dir(Asymptote[0],j);
    dot("$scriptsize "+string(j)+"$",a[j],labdira);*/
  }
    for(int j=0;j<size(Asymptote[1]);++j){
    b.push(point(Asymptote[1],j));
    /*labdirb=rotate(-90)*dir(Asymptote[1],j);
    dot("$scriptsize "+string(j)+"$",b[j],labdirb);*/
  }
    for(int j=0;j<size(Asymptote[2]);++j){
    c.push(point(Asymptote[2],j));
    /*labdirc=rotate(-90)*dir(Asymptote[2],j);
    dot("$scriptsize "+string(j)+"$",c[j],labdirc);*/
  }
picture pic1;
pair Tmin=(a[21].x,a[20].y),Tmax=(a[27].x,a[26].y);
path g1=subpath(Asymptote[0],19,22)--subpath(Asymptote[0],25,28)--cycle;
for(real r=0; r<20; ++r){
save();
fill(pic1,g1);
clip(pic1,box(Tmin,relpoint((Tmin.x,Tmax.y)--Tmax,r/20)));
add(pic1);
Ani.add();
restore();
}
fill(g1);

picture pic2;
pair Tmin=(min(Asymptote[0]).x,a[12].y),Tmax=max(Asymptote[0]);
path g2=subpath(Asymptote[0],22,25)--
               //subpath(Asymptote[0],28,0)--
               a[28]--a[0]--
               subpath(Asymptote[1],2,3)--
               subpath(Asymptote[0],10,13)--
               subpath(Asymptote[2],0,1)--
               subpath(Asymptote[0],18,19)--cycle;
for(real r=0; r<20; ++r){
save();
fill(pic2,g2);
clip(pic2,box(relpoint((Tmin.x,Tmax.y)--Tmin,r/20),Tmax));
add(pic2);
Ani.add();
restore();
}
fill(g2);

picture pic3;
path tr=subpath(Asymptote[1],4,3)--subpath(Asymptote[2],6,1)
                   --subpath(Asymptote[1],2,0)
                   --reverse(subpath(Asymptote[0],6,9));
path tr1=subpath(Asymptote[0],9,10)
                   --subpath(Asymptote[0],13,18)
                   --subpath(Asymptote[0],0,5);
path kk;
for (int i=0; i<=20; ++i){
save();
  kk=reverse(subpath(tr,0,reltime(tr,i/20)))--b[0]--a[9]--subpath(tr1,0,reltime(tr1,i/20))--cycle;
  fill(pic3,kk);
  add(pic3);
Ani.add();
restore();
}

erase();
Ani.movie(BBox(3mm,Fill(white)));

enter image description here

This is my consideration for keyword "A" with Asymptote.

As AlexG's comment: It would involve quite a bit of handwork.

Only for compare and checking purpose.

import animate;
settings.tex="pdflatex"; 
settings.outformat="pdf"; 

animation Ani;
size(10cm);

path[] Asymptote=texpath(Label("A"));

pen[] p={red,green,blue}; p.cyclic=true;

for (int i=0; i <Asymptote.length; ++i)
{
  draw(Asymptote[i],p[i]);
}
pair[] a,b;
pair labdira,labdirb;

  for(int j=0;j<size(Asymptote[0]);++j){
    a.push(point(Asymptote[0],j));
    /*labdira=rotate(-90)*dir(Asymptote[0],j);
    dot("$scriptsize "+string(j)+"$",a[j],labdira);*/
  }
    for(int j=0;j<size(Asymptote[1]);++j){
    b.push(point(Asymptote[1],j));
    /*labdirb=rotate(-90)*dir(Asymptote[1],j);
    dot("$scriptsize "+string(j)+"$",b[j],labdirb);*/
  }

pair M=intersectionpoint(subpath(Asymptote[0],0,1),b[0]--b[0]+(b[0]-b[2]));
path d=subpath(Asymptote[0],intersect(subpath(Asymptote[0],0,1),b[0]--b[0]+(b[0]-b[2]))[0],11)--b[2]--b[0]--cycle;
path q=b[0]--b[1]--subpath(Asymptote[0],12,20)--subpath(Asymptote[0],0,intersect(subpath(Asymptote[0],0,1),b[0]--b[0]+(b[0]-b[2]))[0])--cycle;
//dot(M);
pair K=min(Asymptote[0]),U=max(Asymptote[0]);
draw(box(K,U));

picture pic1;
for(real r=0; r<20; ++r){
save();
fill(pic1,d,red);
clip(pic1,box(K,relpoint((U.x,K.y)--U,r/20)));
add(pic1);
Ani.add();
restore();
}
fill(d,red);
picture pic2;
for(real r=0; r<20; ++r){
save();
fill(pic2,q,red);
clip(pic2,box(relpoint((K.x,U.y)--K,r/20),U));
add(pic2);
Ani.add();
restore();
}
fill(q,red);
pair Mi=(a[11].x,K.y),Ma=(a[12].x,U.y);
picture pic3;

for(real r=0; r<=20; ++r){
save();
fill(pic3,(a[11]--b[2]--b[1]--a[12]--cycle),red);
clip(pic3,box(Mi,relpoint((Mi.x,Ma.y)--Ma,r/20)));
add(pic3);
Ani.add();
restore();
}

erase();
Ani.movie(BBox(3mm,Fill(white)));

enter image description here

Answered by user213378 on March 21, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP