function Stroke($aImg) { // The way the path for the arrow is constructed is partly based // on some heuristics. This is not an exact science but draws the // path in a way that, for me, makes esthetic sence. For example // if the start and end activities are very close we make a small // detour to endter the target horixontally. If there are more // space between axctivities then no suh detour is made and the // target is "hit" directly vertical. I have tried to keep this // simple. no doubt this could become almost infinitive complex // and have some real AI. Feel free to modify this. // This will no-doubt be tweaked as times go by. One design aim // is to avoid having the user choose what types of arrow // he wants. // The arrow is drawn between (x1,y1) to (x2,y2) $x1 = $this->ix1; $x2 = $this->ix2; $y1 = $this->iy1; $y2 = $this->iy2; // Depending on if the target is below or above we have to // handle thi different. if ($y2 > $y1) { $arrowtype = ARROW_DOWN; $midy = round(($y2 - $y1) / 2 + $y1); if ($x2 > $x1) { switch ($this->iPathType) { case 0: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 1: case 2: case 3: $c = array($x1, $y1, $x2, $y1, $x2, $y2); break; default: JpGraphError::RaiseL(6032, $this->iPathType); //('Internal error: Unknown path type (='.$this->iPathType .') specified for link.'); exit(1); break; } } else { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 2: // Always extend out horizontally a bit from the first point // If we draw a link back in time (end to start) and the bars // are very close we also change the path so it comes in from // the left on the activity $c = array($x1, $y1, $x1 + $this->iPathExtend, $y1, $x1 + $this->iPathExtend, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($y2 - $midy < 6) { $c = array($x1, $y1, $x1, $midy, $x2 - $this->iPathExtend, $midy, $x2 - $this->iPathExtend, $y2, $x2, $y2); $arrowtype = ARROW_RIGHT; } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); //('Internal error: Unknown path type specified for link.'); exit(1); break; } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } else { // Y2 < Y1 $arrowtype = ARROW_UP; $midy = round(($y1 - $y2) / 2 + $y2); if ($x2 > $x1) { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($midy - $y2 < 8) { $arrowtype = ARROW_RIGHT; $c = array($x1, $y1, $x1, $y2, $x2, $y2); } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); //('Internal error: Unknown path type specified for link.'); break; } } else { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 2: // Always extend out horizontally a bit from the first point $c = array($x1, $y1, $x1 + $this->iPathExtend, $y1, $x1 + $this->iPathExtend, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($midy - $y2 < 16) { $arrowtype = ARROW_RIGHT; $c = array($x1, $y1, $x1, $midy, $x2 - $this->iPathExtend, $midy, $x2 - $this->iPathExtend, $y2, $x2, $y2); } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); //('Internal error: Unknown path type specified for link.'); break; } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } $aImg->SetColor($this->iColor); $aImg->SetLineWeight($this->iWeight); $aImg->Polygon($c); $aImg->SetLineWeight(1); $arrow->SetColor($this->iColor); $arrow->SetSize($this->iArrowSize); $arrow->SetType($this->iArrowType); $arrow->Stroke($aImg); }
function Stroke(&$aImg) { $x1 = $this->ix1; $x2 = $this->ix2; $y1 = $this->iy1; $y2 = $this->iy2; if ($y2 > $y1) { $arrowtype = ARROW_DOWN; $midy = round(($y2 - $y1) / 2 + $y1); if ($x2 > $x1) { switch ($this->iPathType) { case 0: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 1: case 2: case 3: $c = array($x1, $y1, $x2, $y1, $x2, $y2); break; default: JpGraphError::RaiseL(6032, $this->iPathType); exit(1); break; } } else { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 2: $c = array($x1, $y1, $x1 + $this->iPathExtend, $y1, $x1 + $this->iPathExtend, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($y2 - $midy < 6) { $c = array($x1, $y1, $x1, $midy, $x2 - $this->iPathExtend, $midy, $x2 - $this->iPathExtend, $y2, $x2, $y2); $arrowtype = ARROW_RIGHT; } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); exit(1); break; } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } else { $arrowtype = ARROW_UP; $midy = round(($y1 - $y2) / 2 + $y2); if ($x2 > $x1) { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($midy - $y2 < 8) { $arrowtype = ARROW_RIGHT; $c = array($x1, $y1, $x1, $y2, $x2, $y2); } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); break; } } else { switch ($this->iPathType) { case 0: case 1: $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); break; case 2: $c = array($x1, $y1, $x1 + $this->iPathExtend, $y1, $x1 + $this->iPathExtend, $midy, $x2, $midy, $x2, $y2); break; case 3: if ($midy - $y2 < 16) { $arrowtype = ARROW_RIGHT; $c = array($x1, $y1, $x1, $midy, $x2 - $this->iPathExtend, $midy, $x2 - $this->iPathExtend, $y2, $x2, $y2); } else { $c = array($x1, $y1, $x1, $midy, $x2, $midy, $x2, $y2); } break; default: JpGraphError::RaiseL(6032, $this->iPathType); break; } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } $aImg->SetColor($this->iColor); $aImg->SetLineWeight($this->iWeight); $aImg->Polygon($c); $aImg->SetLineWeight(1); $arrow->SetColor($this->iColor); $arrow->SetSize($this->iArrowSize); $arrow->SetType($this->iArrowType); $arrow->Stroke($aImg); }