我使用WPF工具包图表来显示带有数据点的几个系列.我为LineDataPoints创建了样式,这些样式使用画布,在画布上绘制符号(如圆圈).
这是样式定义之一:
<Style x:Key="CircleDataPointStyleRed"
TargetType="chartingToolkit:LineDataPoint">
<Setter Property="Background"
Value="Red" />
<Setter Property="IsTabStop"
Value="False" />
<Setter Property="Width"
Value="10" />
<Setter Property="Height"
Value="10" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="chartingToolkit:LineDataPoint">
<Canvas>
<Ellipse Height="10"
Width="10"
Stroke="Red" />
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
当我将数据加载到视图模型中时,图表会正确显示,线条可见,并且绘制的数据点居中到正确的位置,因此圆的中心点位于实际数据点的位置.现在,当我将一组不同的数据加载到图表中时(更改LineSeries绑定的ObservableCollections),仍然可以正确绘制线条,但圆圈不会再绘制在中心,而是将其画布的左上角放在实际数据点的位置.当我调整图表大小时,圆圈的位置再次正确.
这里有一些屏幕截图要澄清:
加载第一个数据后:

数据更改为不同值后:

图表调整后:

到目前为止我尝试过的(每个都无济于事):
即使在更改数据后,如何才能在正确的位置绘制数据点?
在我的OpenGL研究中(我认为是OpenGL红皮书),我发现了一个关节机器人手臂模型的例子,它包括一个"上臂",一个"下臂",一个"手",以及五个或更多"手指".每个部分应该能够独立移动,但受"关节"约束(上部和下部"臂"始终连接在"肘部").
在立即模式(glBegin/glEnd)中,它们使用一个立方体的网格,称为"成员",并使用该单个网格的缩放副本用于手臂,手等的每个部分."移动"通过推动完成旋转到下面每个关节的转换矩阵堆栈:肩膀,肘部,手腕,关节 - 你得到了图片.
现在,这解决了问题,但由于它使用旧的,不推荐的立即模式,我还不了解现代OpenGL上下文中这个问题的解决方案.我的问题是:如何使用现代OpenGL解决这个问题?特别是,每个"成员"是否应该跟踪自己当前的转换矩阵,因为矩阵堆栈不再是犹太人?