В строке ниже в вашем коде вы добавляете только последний элемент списка массивов в поле со списком.
jEmployeeComboList.addItem(employees.get(employees.size()-1).getName());
Вы можете добавить все предметы, как это:
for (Employee emp : employees) {
jEmployeeComboList.addItem(emp.getName());
}
Так как координаты Windows являются z в экран (x, пересекают y), я использовал бы что-то как
screenY = viewPort.ActualHeight * (1 - screenY);
вместо
screenY = screenY * viewPort.ActualHeight;
исправлять screenY для размещения Windows.
Поочередно, Вы могли использовать OpenGL. При установке области просмотра x/y/z диапазон Вы могли оставить его в "собственных" единицах и позволить OpenGL преобразовать в координаты экрана.
Править: Так как Ваш источник является центром. Я попробовал бы
screenX = viewPort.ActualWidth * (screenX + 1.0) / 2.0
screenY = viewPort.ActualHeight * (1.0 - ((screenY + 1.0) / 2.0))
Экран + 1.0 преобразовывает из [-1.0, 1.0] к [0.0, 2.0]. В которой точке, Вы делитесь на 2,0 для получения [0.0, 1.0] для умножения. Для составления Windows y, зеркально отражаемого от Декартова y, Вы преобразовываете из [1.0, 0.0] (верхний левый угол к нижнему левому углу), к [0.0, 1.0] (верхний для понижения) путем вычитания предыдущего экрана от 1,0. Затем можно масштабироваться к ActualHeight.
Я создал и успешно протестировал метод работы при помощи 3DUtils исходная библиотека Codeplex.
Реальная работа выполняется в TryWorldToViewportTransform () метод от 3DUtils. Этот метод не будет работать без него (см. вышеупомянутую ссылку).
Очень полезная информация была также найдена в статье Eric Sink: автомасштабирование.
NB. Могут быть более надежные/эффективные подходы, раз так добавьте их как ответ. Тем временем это достаточно хорошо для моих потребностей.
/// <summary>
/// Takes a 3D point and returns the corresponding 2D point (X,Y) within the viewport.
/// Requires the 3DUtils project available at http://www.codeplex.com/Wiki/View.aspx?ProjectName=3DTools
/// </summary>
/// <param name="point3D">A point in 3D space</param>
/// <param name="viewPort">An instance of Viewport3D</param>
/// <returns>The corresponding 2D point or null if it could not be calculated</returns>
public Point? Point3DToScreen2D(Point3D point3D, Viewport3D viewPort)
{
bool bOK = false;
// We need a Viewport3DVisual but we only have a Viewport3D.
Viewport3DVisual vpv =VisualTreeHelper.GetParent(viewPort.Children[0]) as Viewport3DVisual;
// Get the world to viewport transform matrix
Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK);
if (bOK)
{
// Transform the 3D point to 2D
Point3D transformedPoint = m.Transform(point3D);
Point screen2DPoint = new Point(transformedPoint.X, transformedPoint.Y);
return new Nullable<Point>(screen2DPoint);
}
else
{
return null;
}
}
Не ясно, чего Вы пытаетесь достигнуть с aspectRatio коэффициентом. Если точка находится на краю поля зрения, то это должно быть на краю экрана, но если aspectRatio! =1 это не. Попробуйте установку aspectRatio=1 и сделайте квадрат окна. Координаты являются все еще неправильными?
ActualWidth
и ActualHeight
кажется, половина размера окна действительно, таким образом, screenX будет [-ActualWidth; ActualWidth], но не [0; ActualWidth]. Это то, что Вы хотите?
screenX и screenY должны становиться вычисленными относительно экранного центра...
Я не вижу исправление для того, что при рисовании использования Windows API, источник находится в левом верхнем углу экрана. Я предполагаю, что Ваша система координат
y
|
|
+------x
Кроме того, Ваша система координат принимает источник в центре, на вопрос Scott, или является им в левом нижнем углу?
Но, экран Windows API
+-------x
|
|
|
y
Вам было бы нужно координатное преобразование для движения от классического Последователя Декарта в Windows.
Это не обращается к вопросу о ALGORITM, но может быть полезно для того, чтобы Peple поступить по этому вопросу (как я сделал).
В .NET 3.5 Вы можете использовать Visual3D.Transformteancestor (визуальный предчный) . Я использую это, чтобы нарисовать каркас на холсте над моим трехмерным видом на просмотр:
void CompositionTarget_Rendering(object sender, EventArgs e)
{
UpdateWireframe();
}
void UpdateWireframe()
{
GeometryModel3D model = cube.Content as GeometryModel3D;
canvas.Children.Clear();
if (model != null)
{
GeneralTransform3DTo2D transform = cube.TransformToAncestor(viewport);
MeshGeometry3D geometry = model.Geometry as MeshGeometry3D;
for (int i = 0; i < geometry.TriangleIndices.Count;)
{
Polygon p = new Polygon();
p.Stroke = Brushes.Blue;
p.StrokeThickness = 0.25;
p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
canvas.Children.Add(p);
}
}
}
Это также учитывает любые преобразования на модели и т. Д.
. См. Также: http://blogs.smsdn.com/wpf3d /archive/2009/05/13/Transforming-bounds.aspx