c# wpf Polygon 그리기 질문

안녕하세요. c# wpf로 2D, 3D 그리기를 하고 있는데 궁금한 점이 있어 질문을 드리게 되었습니다.

제가 지금 구현하고자 하는 것은 다음과 같습니다.

  1. Drawing에 필요한 좌표 정보 값을 입력 받아 Polygon을 그리는 것입니다. 이때 Polygon객체 안에 있는 것은 Line이 될수도 있고, Arc형태의 반 호 일 수도 있습니다.
  2. 그리고자 하는 Canvas의 중심 좌표를 (0, 0) 으로 하고 싶습니다.
  3. 그려진 데이터를 Zoom in/out할 수 있는 기능이 필요합니다.
  4. 추후 3D로 표현이 가능해야 합니다.

처음 해보는 부분이라 여러가지 해보고 있는데 보다 더 유용하고 효율적인 방법이나 유용한 정보 있으시면 공유 부탁드리겠습니다!!!

Polygon 구현 부

            PointCollection myPointCollection = new PointCollection();
            myPointCollection.Add(new Point(-17.5, 25));
            myPointCollection.Add(new Point(17.5, 25));

            myPointCollection.Add(new Point(-25, 17.5));
            myPointCollection.Add(new Point(-25, -17.5));
            myPointCollection.Add(new Point(-17.5, -25));
            myPointCollection.Add(new Point(17.5, -25));

            myPointCollection.Add(new Point(25, -17.5));
            myPointCollection.Add(new Point(25, 17.5));

            //myPointCollection.Add(new Point(1, 1));
            
            Polygon myPolygon = new Polygon();
            myPolygon.Points = myPointCollection;
            myPolygon.Fill = Brushes.Blue;
            myPolygon.Width = 100;
            myPolygon.Height = 100;
            myPolygon.Stretch = Stretch.Fill;
            myPolygon.Stroke = Brushes.Black;
            myPolygon.StrokeThickness = 2;

            PadCanvas.Children.Add(myPolygon);

xaml에서 반호 구현 부

                        <Canvas Grid.Column="0" x:Name="MyConvas" >
                            <Path Stroke="Aqua" StrokeThickness="0.1" Fill="Aqua" Stretch="Fill"  Width="20" Height="20">
                                <Path.Data>
                                    <PathGeometry>
                                        <PathGeometry.Figures>
                                            <PathFigureCollection>
                                                <PathFigure StartPoint="17.5, -25">
                                                    <PathFigure.Segments>
                                                        <PathSegmentCollection>
                                                            <ArcSegment Size="7.5,7.5" RotationAngle="90" IsLargeArc="False" SweepDirection="Clockwise" Point="25, -17.5" />
                                                        </PathSegmentCollection>
                                                    </PathFigure.Segments>
                                                </PathFigure>
                                                <PathFigure StartPoint="-25, -17.5">
                                                    <PathFigure.Segments>
                                                        <PathSegmentCollection>
                                                            <ArcSegment Size="7.5,7.5" RotationAngle="90" IsLargeArc="False" SweepDirection="Clockwise" Point="-17.5,-25" />
                                                        </PathSegmentCollection>
                                                    </PathFigure.Segments>
                                                </PathFigure>
                                                <PathFigure StartPoint="-17.5, 25">
                                                    <PathFigure.Segments>
                                                        <PathSegmentCollection>
                                                            <ArcSegment Size="7.5,7.5" RotationAngle="45" IsLargeArc="False" SweepDirection="Clockwise" Point="-25, 17.5" />
                                                        </PathSegmentCollection>
                                                    </PathFigure.Segments>
                                                </PathFigure>
                                                <PathFigure StartPoint="25, 17.5">
                                                    <PathFigure.Segments>
                                                        <PathSegmentCollection>
                                                            <ArcSegment Size="7.5,7.5" RotationAngle="45" IsLargeArc="False" SweepDirection="Clockwise" Point="17.5, 25" />
                                                        </PathSegmentCollection>
                                                    </PathFigure.Segments>
                                                </PathFigure>
                                            </PathFigureCollection>
                                        </PathGeometry.Figures>
                                    </PathGeometry>
                                </Path.Data>
                            </Path>
2개의 좋아요

좀 더 작업을 진행하시고 그 과정을 공유해주시면 다른 분들께도 도움이 많이 될 것 같습니다.

WPF의 Canvas의 능력은 무엇을 작업 하시는 것인지는 잘 모르겠으나 충분히 가능하고 잘 표현될 것입니다.

2, 3번의 경우 Transform을 이용해 쉽게 가능합니다.

4번의 경우 뷰포트가 다르므로 다르게 구성을 해야 합니다. 아래의 링크를 참조하세요.

2개의 좋아요

전에 CAD 계열 프로그램을 만들 때가 생각나네요 ㅎㅎ

2D는 Canvas를 이용해서 제한적이지만 말씀하신 부분 구현이 가능해요~
줌인/아웃도 꽤 많은 노드를 갖더라도 1분 내외로 렌더링 할 수 있어요.

그런데 4번… 3D는 좀 달라지는데 여기서부터는 닷넷 기본 기능만으로 작성하기에 한계가 있어서 OpenGL을 사용했었어요.

나중에 다른 솔루션을 적용하는게 편하다고 생각하실 수 있기에 미리 데이터 모델을 잘 작성해두시면 좋을 것 같아요.
같은 데이터 모델을 사용하고 렌더링 클래스만 따로 작성하면 큰 수고를 덜 수 있으니까요.

2개의 좋아요