signFromSymbols function
Builds a Sign from a list of symbols, computing a tight box centered on (500, 500) from the symbols' rendered sizes and repositioning the symbols into that reference frame.
When fixX / fixY is false the corresponding axis is left untouched
(used by the directional joins, which fix only the joining axis).
Mirrors Python signwriting.utils.join_signs.sign_from_symbols.
Implementation
Sign signFromSymbols(List<SignSymbol> symbols,
{bool fixX = true, bool fixY = true}) {
int minX = 999;
int minY = 999;
int maxX = 0;
int maxY = 0;
for (final symbol in symbols) {
minX = min(minX, symbol.position.item1);
minY = min(minY, symbol.position.item2);
final size = getSymbolSize(symbol.symbol);
maxX = max(maxX, symbol.position.item1 + size.item1);
maxY = max(maxY, symbol.position.item2 + size.item2);
}
final boxX = 500 + (maxX - minX) ~/ 2;
final boxY = 500 + (maxY - minY) ~/ 2;
final sizeX = maxX - minX;
final sizeY = maxY - minY;
final newSymbols = <SignSymbol>[];
for (final symbol in symbols) {
int x = symbol.position.item1;
int y = symbol.position.item2;
if (fixX) x += boxX - minX - sizeX;
if (fixY) y += boxY - minY - sizeY;
newSymbols.add(SignSymbol(symbol: symbol.symbol, position: Tuple2(x, y)));
}
return Sign(
box: SignSymbol(symbol: 'M', position: Tuple2(boxX, boxY)),
symbols: newSymbols,
);
}