In the end, I did what @Mark suggested in the comments, I calculate the point, which is the height of the curve along the normal in the middle between two points, then calculates the unit vectors from the start point to the midpoint and again from the middle to the end. Then I can use them to get all the necessary points.
var arrowRadius = 6, arrowPointRadius = arrowRadius * 2, arrowPointHeight = arrowRadius * 3, baseHeight = 30;
path { stroke: #11a; fill: #eee; }
<script src="https://d3js.org/d3.v4.min.js"></script> <svg width="600" height="220"></svg>
source share