Не уверен, что это достигнет того, что вы ищете, но это должно помочь, если проблема связана с округлением.Как я уже говорил в комментариях, ваш код выглядит в основном правильно, я думаю, что это проблема округления при вычислении dpi.Поскольку вы хотите визуализировать на основе 96 точек на дюйм, вычислите координаты на основе 96 точек на дюйм, а затем конвертируйте точки в ваше устройство.Я написал это для большей ясности, вы можете использовать один массив точек и просто помнить, что i
- это начальная точка, а i+1
- это конечная точка, и тогда вам потребуется всего лишь один вызов для преобразования точек.
private void RenderDrawing()
{
var s = PresentationSource.FromVisual(this);
var dpiX = 96;
int numberOfLines = 10;
double N = 1;
double spacing = dpiX / N;
var startPoints = new Point[numberOfLines]();
var endPoints = new Point[numberOfLines]();
for (int i = 0; i < numberOfLines; i++)
{
var x = i * spacing;
startPoints[i] = new Point(x, 0);
endPoints[i] = new Point(x, 100);
}
s.CompositionTarget.TransformToDevice.Transform(startPoints);
s.CompositionTarget.TransformToDevice.Transform(endPoints);
using (var c = drawing.RenderOpen())
{
using (var p = new Pen(new SolidColorBrush(Colors.Black), 1))
{
for(int i=0; i < numberOfLines; i++)
{
c.DrawLine(p, startPoints[i], endPoints[i]);
}
}
}
}