2023-08-23 18:21:42 +02:00

123 lines
3.2 KiB
Plaintext

// préambule asymptote
usepackage("amsmath,amssymb");
usepackage("inputenc","utf8");
usepackage("icomma");
import lib_jl;
// code figure
real treeNodeStep = 0.3cm;
real treeLevelStep = 2.2cm;
real treeMinNodeHeight = 0.6cm;
struct TreeNode
{
TreeNode parent;
TreeNode[] children;
frame content;
string prob;
pair pos;
real adjust;
bool labelpos;
}
void add( TreeNode child, TreeNode parent )
{
child.parent = parent;
parent.children.push( child );
}
TreeNode makeNode( TreeNode parent = null, frame f, string p, bool l )
{
TreeNode child = new TreeNode;
child.content = f;
child.prob = p;
child.labelpos=l;
if( parent != null ) {add( child, parent );}
return child;
}
TreeNode makeNode( TreeNode parent = null, Label label, string p, bool l )
{
frame f;
label(f,label);
return makeNode( parent, f,p,l );
}
real layout( int level, TreeNode node )
{
real maxp=0;
real minp=1e10;
if( node.children.length > 0 )
{
real height[] = new real[node.children.length];
real curHeight = 0;
for( int i=node.children.length-1;i>=0; --i )
{
height[i] = layout( level+1, node.children[i] );
node.children[i].pos = (level*treeLevelStep,curHeight + height[i]/2);
maxp=max(maxp,node.children[i].pos.y);
minp=min(minp,node.children[i].pos.y);
curHeight += height[i] + treeNodeStep;
}
real midPoint=(maxp+minp)/2;
for( int i=node.children.length-1;i>=0; --i )
{
node.children[i].adjust = - midPoint;
}
return max( (max(node.content)-min(node.content)).y,sum(height)+treeNodeStep*(height.length-1) );
}
else {return max( treeMinNodeHeight, (max(node.content)-min(node.content)).y );}
}
void drawAll( TreeNode node, frame f )
{
pair pos;
if( node.parent != null ) pos = (0,node.parent.pos.y+node.adjust);
else pos = (0,node.adjust);
node.pos += pos;
node.content = shift(node.pos)*node.content;
add( f, node.content );
string proba=node.prob;
bool arrow=(find(proba,"@",0)!=-1);
if (arrow) proba=replace(proba,"@","");
if( node.parent != null )
{
path p = point(node.content, W)--point(node.parent.content,E);
if (arrow) draw(p, currentpen,BeginArrow(2mm) );
else draw(p, currentpen);
if( node.prob != "" )
{
if (node.labelpos) draw(Label(scale(.5)*proba),p,N);
else draw(Label(scale(.5)*proba),p,S);
}
else
{
if (arrow) draw(p, currentpen,BeginArrow(2mm) );
else draw(p, currentpen);
}
}
for( int i = 0; i < node.children.length; ++i ) drawAll( node.children[i], f );
}
void draw( TreeNode root, pair pos )
{
frame f;
root.pos = (0,0);
layout( 1, root );
drawAll( root, f );
add(f,pos);
}
TreeNode root = makeNode("","",true);
TreeNode noeud1=makeNode(root,"$L$","$P(L)$",true);
TreeNode noeud5=makeNode(noeud1,"$F$","$P_L(F)$",true);
TreeNode noeud6=makeNode(noeud1,"$G$","$P_L(G)$",false);
TreeNode noeud2=makeNode(root,"$E$","$P(E)$",true);
TreeNode noeud7=makeNode(noeud2,"$F$","$P_E(F)$",true);
TreeNode noeud8=makeNode(noeud2,"$G$","$P_E(G)$",false);
TreeNode noeud3=makeNode(root,"$S$","$P(S)$",false);
TreeNode noeud9=makeNode(noeud3,"$F$","$P_S(F)$",true);
TreeNode noeud10=makeNode(noeud3,"$G$","$P_S(G)$",false);
draw(root,(0,0));
transform t=shift(1cm,0);
label("$p(R_n\cap R_{n+1})=\dots$",t*noeud2,align=E);
label("$p(\overline{R_n}\cap R_{n+1})=\dots$",t*noeud3,align=E);