private int GetFootForArrow(int arrow, MetricPosition position, ExpressedChart.ChartSearchNode node) { while (node != null && node.Position == position) { if (node.PreviousLink != null && !node.PreviousLink.GraphLink.IsRelease()) { // If this step is a footswap we need to ignore the other foot, which may still be resting on this arrow. var previousStepLink = node.GetPreviousStepLink(); var footSwapFoot = InvalidFoot; var footSwapPortion = DefaultFootPortion; var footSwap = previousStepLink?.GraphLink.IsFootSwap(out footSwapFoot, out footSwapPortion) ?? false; if (footSwap && node.GraphNode.State[footSwapFoot, footSwapPortion].Arrow == arrow) { return(footSwapFoot); } // No footswap on the given arrow. for (var f = 0; f < NumFeet; f++) { for (var p = 0; p < NumFootPortions; p++) { if (node.GraphNode.State[f, p].Arrow == arrow) { return(f); } } } } node = node.GetNextNode(); } return(InvalidFoot); }
private void WriteExpression(ExpressedChart.ChartSearchNode node, double y) { if (node == null) { return; } var position = node.Position; while (node != null && node.Position == position) { if (node.PreviousLink != null && !node.PreviousLink.GraphLink.IsRelease()) { var writeCost = false; for (var p = 0; p < NumFootPortions; p++) { // Left Foot if (LastExpressionPosition[L] < y && node.PreviousLink.GraphLink.Links[L, p].Valid) { var leftX = ExpressedChartX + ExpressionColumnInfo[(int)ExpressionColumns.LeftFoot].X; var stepStr = StepTypeStrings[(int)node.PreviousLink.GraphLink.Links[L, p].Step]; if (node.PreviousLink.GraphLink.IsJump()) { stepStr = "[Jump] " + stepStr; } StreamWriter.Write( $@" <p class=""exp_text"" style=""top:{(int)(y - ChartTextH * .5)}px; left:{leftX}px; width:{ExpressionColW}px;"">{stepStr}</p> "); writeCost = true; LastExpressionPosition[L] = y; } // Right Foot if (LastExpressionPosition[R] < y && node.PreviousLink.GraphLink.Links[R, p].Valid) { var rightX = ExpressedChartX + ExpressionColumnInfo[(int)ExpressionColumns.RightFoot].X; var stepStr = StepTypeStrings[(int)node.PreviousLink.GraphLink.Links[R, p].Step]; if (node.PreviousLink.GraphLink.IsJump()) { stepStr = "[Jump] " + stepStr; } StreamWriter.Write( $@" <p class=""exp_text"" style=""top:{(int)(y - ChartTextH * .5)}px; left:{rightX}px; width:{ExpressionColW}px;"">{stepStr}</p> "); writeCost = true; LastExpressionPosition[R] = y; } } // Cost if (writeCost) { var costX = ExpressedChartX + ExpressionColumnInfo[(int)ExpressionColumns.Cost].X; StreamWriter.Write( $@" <p class=""exp_text"" style=""top:{(int) (y - ChartTextH * .5)}px; left:{costX}px; width:{CostColW}px;"">{node.Cost}</p> "); } } node = node.GetNextNode(); } }