Comment placer la tête de flèche triangles sur SVG lignes?
Je suis nouveau sur le SVG et je suis en train de tracer une ligne droite entre deux points. J'ai réussi jusqu'à présent à l'aide de cette commande:
<line x1="50" y1="50" x2="150" y2="150" style="stroke:rgb(255,255,0); stroke-width:2" stroke-dasharray="5,3" />"
Quelle est la façon la plus simple pour ajouter des petits triangles ou des flèches (espacés uniformément) sur cette ligne pour indiquer la direction?
Edit 1:
Juste pour être plus clair, je ne suis pas après une flèche à l'extrémité de la ligne, mais plusieurs triangles (régulièrement espacés le long de la ligne entière. Si possible, je voudrais remplacer chaque tiret à la ligne en pointillés avec un triangle pointant dans la direction de la ligne.
Edit 2
Basé sur Phrogz suggestion, j'ai créé une page comme indiqué ci-dessous, mais rien ne s'affiche. Ce que je fais mal?
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<link href="css/com.css" rel="stylesheet" type="text/css" />
</head>
<body style="background:none;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -10 70 90">
<defs>
<marker id="t" markerWidth="4" markerHeight="4"
orient="auto" refY="2">
<path d="M0,0 L4,2 0,4" />
</marker>
</defs>
<polyline points="0,0 0,50 20,70 40,10 42,8 44,10, 46,14 50,50" />
</svg>
<script type="text/javascript">
midMarkers(document.querySelector('polyline'),6);
//Given a polygon/polyline, create intermediary points along the
//"straightaways" spaced no closer than `spacing` distance apart.
//Intermediary points along each section are always evenly spaced.
//Modifies the polygon/polyline in place.
function midMarkers(poly,spacing){
var svg = poly.ownerSVGElement;
for (var pts=poly.points,i=1;i<pts.numberOfItems;++i){
var p0=pts.getItem(i-1), p1=pts.getItem(i);
var dx=p1.x-p0.x, dy=p1.y-p0.y;
var d = Math.sqrt(dx*dx+dy*dy);
var numPoints = Math.floor( d/spacing );
dx /= numPoints;
dy /= numPoints;
for (var j=numPoints-1;j>0;--j){
var pt = svg.createSVGPoint();
pt.x = p0.x+dx*j;
pt.y = p0.y+dy*j;
pts.insertItemBefore(pt,i);
}
if (numPoints>0) i += numPoints-1;
}
}
</script>
</body>
</html>
- Voir aussi Comment pouvez-vous tirer une flèche à l'extrémité d'une courbe de Bézier en SVG/Raphaël?
- Il est important de noter que le
marker-mid
attribut n'a d'effet que si le chemin d'accès a points entre début/fin.
Vous devez vous connecter pour publier un commentaire.
Basé sur une clarification de la question, voici une implémentation de la création d'intermédiaire des points le long d'une
<polyline>
élément, telles que lamarker-mid="url(#arrowhead)"
attribut de travail. Voir ci-dessous que pour une introduction à des marqueurs et des pointes de flèches.Démo: http://jsfiddle.net/Zv57N/
Le code ci-dessus modifie une
<polyline>
élément à ajouter des points à chaque espacement unités le long de chaque bord droit. Combinez cela avecmarker-mid
à la place une rotation du repère à chaque sommet, et vous avez la possibilité de dessiner des arbitrairement complexes, des formes et des graphiques de façon constante le long de votre chemin.Bien que le code des espaces les points uniformément le long de chaque segment (alors qu'aucun disgracieux 'regrouper' se produit dans les coins) que la démo ci-dessus affiche le code ne supprime pas tous les points que vous avez déjà dans votre chemin d'accès qui sont plus rapprochés que les espacement valeur.
(À l'origine de "l'introduction de Marqueurs" suit la réponse.)
Vous souhaitez définir un SVG
<marqueur>
de l'élément et ajouter lemarker-start="…"
et/oumarker-end="…"
des attributs à votre ligne. À l'aide d'un marqueur des copies de n'importe quelle forme sur la fin(s) de votre chemin, et (avecorient="auto"
) tourne la forme de match.Démo: http://jsfiddle.net/Z5Qkf/1/
Ci-dessus:
orient="auto"
provoque le marqueur de tourner avec la lignemarkerWidth
etmarkerHeight
définir un cadre de sélection (comme un viewBox) à utiliser pour le marqueur.stroke-width
de la dernière ligne; ayant une hauteur de "4" provoque de 20 unités de large dans le dessin final (4×5).refX
etrefY
de définir l'emplacement de la 'l'origine' est lors de la passation de la forme sur la fin du cheminrefX="0.1"
pour s'assurer que le marqueur chevauche la fin de la ligne légèrementfill-opacity
etstroke-opacity
du marqueur et/ou de la ligne de façon indépendante, mais les modifications apportées à laopacity
de la ligne va affecter le dessiné au marqueur, ainsi.fill-opacity
de le marqueur que vous souhaitez voir les chevauchements; toutefois, si vous baissez laopacity
de la ligne elle-même alors le marqueur est composée entièrement opaque sur la ligne et la combinaison des deux est ensuite descendu dans l'opacité.Si vous voulez des flèches le long de la longueur de la ligne, vous aurez besoin d'utiliser
marker-mid="…"
soit avec<path>
ou<polyline>
et intermédiaires le long de la ligne.Démo: http://jsfiddle.net/Z5Qkf/2/
Le seul problème est que tout point qui change de direction le long de la ligne les dégâts de l'orientation; c'est pourquoi, dans la démo, j'ai utilisé une courbe de Bézier à un angle de sorte que le point central sur la ligne le long d'une section droite.
Pour ce faire, sur le plan procédural, vous pouvez utiliser le JavaScript et le
getPointAtLength()
de commande pour un chemin d'accès à exemple le chemin d'accès.<
en elle. Cela rend non valide XHTML. Vous devez emballer votre script contenu dans<![CDATA[ … ]]>
ou express le SVG comme pur HTML5. Dans l'avenir, lorsque vous rencontrez des problèmes, vous devriez être sûr de valider votre balisage.marker-mid
a été appliquée, ainsi que d'autres stylings. Vous pouvez commencer avec cette autonome démo comme un point de travail.<polyline points="0,100 200,100" />
avec différentes coordonnées ne semble pas fonctionner.polys.forEach(function(p){ midMarkers(p,10); });
avecfor(i=0; i<polys.length; i++) {midMarkers(polys[i],10);}
.[].forEach.call( polys, function(p){ midMarkers(p,10) } );
refX
,refY
j'ai pu trouver, merciVeux juste ajouter quelques liens utiles et exemples:
1. La flèche peut être quadratique
2. Cubes courbe
Documentation: https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
Démo: les deux types de flèches mis en place ici:
HTML: