//[MO 10.03.2020] funkcja chwilowo wyłączona do poprawnej kompilacji /*internal static void DrawBezierCurve(cSegment xSegment, cSegment xSegment_Next, PaintEventArgs e) { * //funkcja rysująca łuk po wybraniu boku * //xNumber - numer segmentu * //xSegments - nazwa listy segmentów * * float pCenterX; //punkt X środka segmentu * float pCenterY; //punkt Y środka segmentu * float pControl_1X; //punkt X punktu kotrolnego 1 do rysowania łuku 1:4 odcinka segmentu * float pControl_1Y; //punkt Y punktu kotrolnego 1 do rysowania łuku * float pControl_2X; //punkt X punktu kotrolnego 2 do rysowania łuku * float pControl_2Y; //punkt Y punktu kotrolnego 2 do rysowania łuku * double pVectNormalX; //X wektora prostopadłego do segmenty, do przesunięcia punktów kontrolnych * double pVectNormalY; //Y wektora prostopadłego do segmenty, do przesunięcia punktów kontrolnych * * // f(x)=0 * if ((xSegments[xNumber].Point.X - xSegments[xNumber+1].Point.X == 0)) { * pVectNormalX = Math.Abs((xSegments[xNumber + 1].Point.Y - xSegments[xNumber].Point.Y) / 4); * pVectNormalY = 0; * } * // f(y)=0 * else if ((xSegments[xNumber].Point.Y - xSegments[xNumber + 1].Point.Y == 0)) { * pVectNormalX = 0; * pVectNormalY = Math.Abs((xSegments[xNumber + 1].Point.X - xSegments[xNumber].Point.X) / 4); * } * // f(y)=ax+b * else { * int pIncreaseVector = 50; * pVectNormalX = Math.Abs((xSegments[xNumber].Point.Y - xSegments[xNumber + 1].Point.Y) / * (xSegments[xNumber].Point.X - xSegments[xNumber + 1].Point.X)) * pIncreaseVector; * pVectNormalY = pIncreaseVector; * } * pCenterX = (xSegments[xNumber].Point.X + xSegments[xNumber+1].Point.X) / 2; * pCenterY = (xSegments[xNumber].Point.Y + xSegments[xNumber+1].Point.Y) / 2; * * Console.WriteLine(" S: (" + pCenterX + " ; " + pCenterY + ") "); * SetCheckCirclePoint(mCircleCenter, (int)pCenterX, (int)pCenterY); * * //przesunięcie środka segmentu o wektor * //w zależności od ćwiartki w której się znajduję środek koła, * //na którym opisana jest figura * if (mCheckCirclePoint == 1) { * pCenterX = pCenterX + (float)pVectNormalX; * pCenterY = pCenterY + (float)pVectNormalY; * } else if (mCheckCirclePoint == 2) { * pCenterX = pCenterX - (float)pVectNormalX; * pCenterY = pCenterY + (float)pVectNormalY; * } else if (mCheckCirclePoint == 3) { * pCenterX = pCenterX - (float)pVectNormalX; * pCenterY = pCenterY - (float)pVectNormalY; * } else if (mCheckCirclePoint == 4) { * pCenterX = pCenterX + (float)pVectNormalX; * pCenterY = pCenterY - (float)pVectNormalY; * } else { * pCenterX = pCenterX + (float)pVectNormalX; * pCenterY = pCenterY - (float)pVectNormalY; * } * * pControl_1X = (xSegments[xNumber].Point.X + pCenterX) / 2; * pControl_1Y = (xSegments[xNumber].Point.Y + pCenterY) / 2; * pControl_2X = (pCenterX + xSegments[xNumber+1].Point.X) / 2; * pControl_2Y = (pCenterY + xSegments[xNumber+1].Point.Y) / 2; * * PointF start = new PointF(xSegments[xNumber].Point.X, xSegments[xNumber].Point.Y); * PointF pControlPoint1 = new PointF(pControl_1X, pControl_1Y); * PointF pControlPoint2 = new PointF(pControl_2X, pControl_2Y); * PointF end = new PointF(xSegments[xNumber+1].Point.X, xSegments[xNumber+1].Point.Y); * Pen pBluePen = new Pen(Color.Blue, 3); * * e.Graphics.DrawBezier(pBluePen, start, pControlPoint1, pControlPoint2, end); * * }*/ internal static void SetCheckCirclePoint(cPoint xCircleCenter, int xSegmentPointX, int xSegmentPointY) { //fukcja ustawiająca int pCheckCirclePoint w zależności od tego w której ćwiartce znajduje się środek segmentu //xCircleCenter - //xSegmentPointX - //xSegmentPointY - int pQuarterOfCoordinateSystem = new int(); if (xCircleCenter.X <= xSegmentPointX && xCircleCenter.Y <= xSegmentPointY) { pQuarterOfCoordinateSystem = 1; } else if (xCircleCenter.X > xSegmentPointX && xCircleCenter.Y <= xSegmentPointY) { pQuarterOfCoordinateSystem = 2; } else if (xCircleCenter.X > xSegmentPointX && xCircleCenter.Y > xSegmentPointY) { pQuarterOfCoordinateSystem = 3; } else if (xCircleCenter.X <= xSegmentPointX && xCircleCenter.Y > xSegmentPointY) { pQuarterOfCoordinateSystem = 4; } else { Console.WriteLine("Błąd liczenia ćwiartki"); } mCheckCirclePoint = pQuarterOfCoordinateSystem; }
//klasa tworząca listy segmentów, do rysowania figur geometrycznych. // 1.Prostokąt - GetPolygon_Rect // 2.Wielokąt Foremny - GetPolygon_Regular public static cPolygon GetPolygon_Rect(cPoint xPoint, int xWidth, int xHeight) { //funkcja dodająca 4 cSegmenty do listy, z której powstaje prostokąt //xPoint - współrzędne punktu bazowego //xWidth - szerokość prostokąta //xHeight - wysokość prostokąta cPolygon pPolygon_Rect; cSegment pSegment; pPolygon_Rect = new cPolygon(); pSegment = GetSegment(0, 0, xPoint, 1); pPolygon_Rect.AddSegment(pSegment, 0); pSegment = GetSegment(xWidth, 0, xPoint, 2); pPolygon_Rect.AddSegment(pSegment, 1); pSegment = GetSegment(xWidth, -xHeight, xPoint, 3); pPolygon_Rect.AddSegment(pSegment, 2); pSegment = GetSegment(0, -xHeight, xPoint, 4); pPolygon_Rect.AddSegment(pSegment, 3); pPolygon_Rect.ShowSegmentsList(); return(pPolygon_Rect); }
//internal int Type { get { return mType; } set { mType = value; } } public cSegment(cPoint xPointOfSegment, int xNumberOfSegment) { //xPointOfSegment - pierwszy punkt danego cSegmentu //xNumberOfSegment - numer danego cSegmentu this.mPoint = xPointOfSegment; this.mNumber = xNumberOfSegment; }
public static cSegment GetSegment(int xOffsetX, int xOffsetY, cPoint xPoint, int xNumber) { //funkcja zwracająca segment //xOffsetX - przesunięcie względem osi X //xOffsetY - przesunięcie względem osi Y //xPoint - współrzędne punktu bazowego //xNumber - numer segmentu cPoint pPoint; PointF pPointHelper; cSegment pSegment; pPointHelper = new PointF(xPoint.X + xOffsetX, xPoint.Y + xOffsetY); pPoint = new cPoint(pPointHelper); pSegment = new cSegment(pPoint, xNumber); return(pSegment); }
private void btnDrawRectangle_Click(object sender, EventArgs e) { //funkca tworząca poligon prostokąta double pRect_Height, pRect_Width; //przeskalowana wysokość, szerokość prostokąta cPoint pStartPoint; //punkt bazowy CalculateScale(); pStartPoint = new cPoint(new PointF()); pRect_Width = int.Parse(txtWidth.Text) * (mScale); pRect_Height = int.Parse(txtHeight.Text) * (mScale); pStartPoint.X = (pnlCanvas.Width - (int)pRect_Width) / 2; pStartPoint.Y = (pnlCanvas.Height - (int)pRect_Height) / 2 + (int)pRect_Height; mPolygon_Rect = cPolygonFactory.GetPolygon_Rect(pStartPoint, (int)pRect_Width, (int)pRect_Height); this.pnlCanvas.Refresh(); }
private void btnDrawRegularPolygon_Click(object sender, EventArgs e) { //funkca tworząca poligon wielokąta foremnego double pBaseAngle; //kąt pomiędzy: punkt1 segmentu - środek koła - punkt2 segmentu cPoint pCircleCenter; //punkt - środek okręgu double pRadiusOfCircle; //przeskalowany promień koła CalculateScale(); pCircleCenter = new cPoint(new PointF()); pCircleCenter.X = pnlCanvas.Width / 2; pCircleCenter.Y = pnlCanvas.Height / 2; pRadiusOfCircle = double.Parse(txtDiameter.Text) / 2 * (mScale); pBaseAngle = 360 / int.Parse(txtSlides.Text); //dodać blokadę dzielenia przez 0 cDrawingAdapter.CircleCenter = pCircleCenter; mPolygon_Regular = cPolygonFactory.GetPolygon_Regular(pCircleCenter, (int)pRadiusOfCircle, -pBaseAngle); this.pnlCanvas.Refresh(); }
public static cPolygon GetPolygon_Regular(cPoint xCircleCenter, int xRadius, double xAngle) { //funkcja dodająca segmenty do listy, z której powstaje wielokąt foremny //xCircleCenter - środek koła, na którym wpisana jest figura //xRadius - promień koła w który jest wpisana figura //xAngle - kąt pomiędzy [punktem pPoint - środkiem koła xCircleCenter - punktem pPoint(z kolejnego segmentu)] double pAngleTemp; //wartość kąta pomiędzy punktem pierwszego segmentu - środkiem koła - punktem kolejnego segmentu double pAngleTotal; //kąt pAngleTemp przedstawiony w radianach double pCosinusOfAngleTotal; //cosunus kąta pAngleTemp int pNumber; //numer danego segmentu cPolygon pPolygon_Regular; cSegment pSegment; double pSinusOfAngleTotal; //sinus kąta pAngleTemp double pTotalSegments; //liczba wszystkich boków figury double pAngleIncremental; pNumber = 0; pTotalSegments = 360 / Math.Abs(xAngle); pPolygon_Regular = new cPolygon(); for (pAngleIncremental = 0; pAngleIncremental <= 360 - Math.Abs(xAngle); pAngleIncremental += Math.Abs(xAngle)) { pAngleTemp = xAngle / 2 + (Math.Abs(xAngle)) * pNumber; pAngleTotal = (pAngleTemp * (Math.PI)) / 180; pCosinusOfAngleTotal = Math.Cos(pAngleTotal); pSinusOfAngleTotal = Math.Sin(pAngleTotal); pNumber++; pSegment = GetSegment((int)(xRadius * pSinusOfAngleTotal), (int)(xRadius * pCosinusOfAngleTotal), xCircleCenter, pNumber); pPolygon_Regular.AddSegment(pSegment, pNumber - 1); } return(pPolygon_Regular); }