Direct2D jest poprawnie renderowania. Kiedy podasz mu współrzędne pikseli, takie jak (100, 120), odnosi się do górnego i lewego narożnika elementu piksela, który rozciąga się od współrzędnych pikseli (100, 120) do (101, 121) (góra/lewo są włączone, prawo/dół są wyłączne). Ponieważ jest to prosta linia pozioma, skutecznie uzyskujesz wypełniony prostokąt od (99,5, 119,5) - (300,5, 120,5). Ponieważ krawędzie tego rozlewają się na sąsiednie piksele, dlatego uzyskujesz "2-pikselową szerokość" linii przy "niewłaściwej" jasności. Musisz myśleć w kategoriach piksela współrzędnych (punkty bez obszaru) i pikseli elementów (fizyczne punkty na ekranie o powierzchni 1x1, lub tylko 1 oczywiście).
Jeśli chcesz narysować linię prostą, która obejmuje piksele (100, 120) do (300, 120), powinieneś skorzystać z sugestii SemMike dotyczącej używania renderowania alikwotowego (co jest świetne w przypadku linii prostych!), Lub możesz użyć przesunięcia o pół piksela (ponieważ strokeWidth = 1; dla innych wartości strokeWidths, ustaw wartość strokeWidth/2). Rysunek od (100,5, 120,5) - (299,5, 120,5) o szerokości obrysu 1,0 da ci to, czego szukasz. Udar ten rozciąga się wokół określonych przez ciebie współrzędnych pikseli, więc otrzymasz "wypełniony prostokąt" nad elementami piksela (100, 120) - (300, 121). I znowu, jest to ekskluzywny zakres, więc "y = 121" nie jest faktycznie wypełniony, ani nie jest x = 300.
Jeśli zastanawiasz się, dlaczego tak się nie dzieje z czymś podobnym do GDI, to dlatego, że nie renderuje antyaliasingu, więc wszystko zawsze przyciąga do elementów pikselowych. Jeśli zastanawiasz się, dlaczego tak się nie dzieje podczas korzystania z WPF podczas korzystania z kształtów, dzieje się tak dlatego, że używa ona zaokrąglania układu (UseLayoutRounding) i przyciągania pikseli. Direct2D nie zapewnia tych usług, ponieważ jest to API o relatywnie niskim poziomie.
Dzięki za wyjaśnienie, ma sens. Czy tęsknię za tym w dokumentach MSDN gdzieś na Direct2D, czy też nie ma go tam i powinienem wiedzieć? "Rysowanie z (100,5, 120,5) - (299,5, 120,5) o szerokości obrysu 1,0 da ci to, czego szukasz" Jeśli dobrze cię zrozumiem, będzie to (100,5, 120,5) - (300,5, 120,5) . W przeciwnym razie pominięty zostanie ostatni piksel linii. Przy okazji, "sugestia SemMike": ten sam facet, odpowiadałem na własne pytanie ... – SemMike
Niezależnie od tego, czy używasz 299.5, czy 300.5, zależy od tego, czy chcesz mieć linię szeroką na 200 pikseli czy linię 201px. Prawdopodobnie nie jest tak w dokumentach, ponieważ jest dość standardowy dla nowoczesnych interfejsów graficznych 2D, ale jest też trochę nieoczywisty i zaawansowany, a często ludzie, którzy pracują nad zaawansowanymi materiałami, zapominają o tym, czego nie wiedzieli, zanim zostali to zaawansowane. Uważam, że pomaga to myśleć jak arkusz papieru w siatce. Tam, gdzie przecinają się poziome i pionowe linie są współrzędne pikseli całkowitych, a kwadraty pomiędzy nimi są "fizycznymi" elementami pikseli. –