/// <summary> /// 点の追加(ボタンver) /// </summary> public void AddPoint() { var LastCnt = m_list.Count() - 1; BezierPoint startBezirPoint = new BezierPoint(); const int ofsetX = 30; // startBezirPoint.startPoint = new Point(Math.Min(m_list[LastCnt].startPoint.X + ofsetX, ScrrenRightPosX - 1), m_list[LastCnt].startPoint.Y); startBezirPoint.endPoint = new Point(m_list[LastCnt].endPoint.X, m_list[LastCnt].endPoint.Y); //制御点は追加される開始点の少し右に生成させる var cpointX = CMath.Clamp(startBezirPoint.startPoint.X + 10, ScrrenLeftPosX, ScrrenRightPosX - 1); startBezirPoint.controlPoint1 = new Point(cpointX, m_list[LastCnt].startPoint.Y + 30); startBezirPoint.controlPoint2 = new Point(cpointX, m_list[LastCnt].startPoint.Y - 30); m_list.Add(startBezirPoint);//新しい点追加 //追加前の最後の終了点を追加した最後の開始点とつなげる ここ大事! BezierPoint BezirPoint = new BezierPoint(); BezirPoint = m_list[LastCnt]; BezirPoint.endPoint = m_list[LastCnt + 1].startPoint;//繋ぎなおす m_list[LastCnt] = BezirPoint; //増やした点を選択状態に m_SelectPoint = LastCnt + 1; }
/// <summary> /// 開始点セット /// </summary> /// <param name="y"></param> public int SetStartPointX(int x) { BezierPoint sp = m_list[m_SelectPoint]; //最初の点 if (isSelectFirstStartPoint()) { return(0); } if (m_SelectMode == SelectMode.None) { return(0); } var BeforeSelectPoint = m_SelectPoint - 1; //X軸の移動 intervalPointPosを加算減算すること隣の点と同じ座標にならないようにする int minpx = m_list[BeforeSelectPoint].startPoint.X + intervalPointPos; int maxpx = sp.endPoint.X - intervalPointPos; sp.startPoint.X = CMath.Clamp(x, minpx, maxpx); //ひとつ前の終了点の移動 BezierPoint sp2 = m_list[BeforeSelectPoint]; sp2.endPoint = sp.startPoint; m_list[BeforeSelectPoint] = sp2; m_list[m_SelectPoint] = sp; return(x); }
/// <summary> /// CSVからデータを読み込み /// </summary> /// <param name="s"></param> /// <returns></returns> public List <CurvePointControl.BezierPoint> Load(string s) { List <CurvePointControl.BezierPoint> list = new List <CurvePointControl.BezierPoint>(); StreamReader file = new StreamReader(s); //末尾まで繰り返す while (!file.EndOfStream) { // CSVファイルの一行を読み込む string line = file.ReadLine(); // 読み込んだ一行をカンマ毎に分けて配列に格納する string[] values = line.Split(','); CurvePointControl.BezierPoint b = ToBezierPoint(values); list.Add(b); } file.Close(); //例外処理 var sx = CMath.ChageDecimalPosX(list[0].startPoint.X); var ex = CMath.ChageDecimalPosX(list[list.Count - 1].endPoint.X); if (sx != 0) { MessageBox.Show("グラフデータがおかしいです"); } if (ex != 1) { MessageBox.Show("グラフデータがおかしいです"); } return(list); }
/// <summary> /// 制御点2Xセット /// </summary> /// <param name="y"></param> public int SetControl2PointX(int x) { if (m_SelectMode == SelectMode.None) { return(0); } BezierPoint sp = m_list[m_SelectPoint]; //選択している点 sp.controlPoint2.X = CMath.Clamp(x, ScrrenLeftPosX, ScrrenRightPosX); //一番最初の開始点以外を選択しているなら if (!isSelectFirstStartPoint()) { int minpx = m_list[m_SelectPoint - 1].endPoint.X + ControlOfSetX; sp.controlPoint2.X = CMath.Clamp(sp.controlPoint2.X, minpx, ScrrenRightPosX); } //一番最後の終了点以外を選択しているなら if (!isSelectLastEndPoint()) { int maxpx = m_list[m_SelectPoint + 1].startPoint.X - ControlOfSetX; sp.controlPoint2.X = CMath.Clamp(sp.controlPoint2.X, ScrrenLeftPosX, maxpx); } m_list[m_SelectPoint] = sp; return(sp.controlPoint2.X); }
/// <summary> /// 点の追加(ダブルクリックVer) /// </summary> /// <param name="p"></param> public void AddPoint(Point p) { var SelectNum = SearchSelectStartPoint(p);//何番目の点になるか BezierPoint startBezirPoint = new BezierPoint(); const int ofsetY = 30; startBezirPoint.startPoint = new Point(Math.Min(p.X, ScrrenRightPosX - 1), CMath.Clamp(p.Y, ScrrenTopPosY, ScrrenBottomPosY)); startBezirPoint.endPoint = new Point(m_list[SelectNum].endPoint.X, m_list[SelectNum].endPoint.Y); //制御点は追加される開始点の少し右に生成させる var cpointX = CMath.Clamp(startBezirPoint.startPoint.X + 10, ScrrenLeftPosX + ControlOfSetX, ScrrenRightPosX - ControlOfSetX); startBezirPoint.controlPoint1 = new Point(cpointX, CMath.Clamp(startBezirPoint.startPoint.Y + ofsetY, ScrrenTopPosY, ScrrenBottomPosY)); startBezirPoint.controlPoint2 = new Point(cpointX, CMath.Clamp(startBezirPoint.startPoint.Y - ofsetY, ScrrenTopPosY, ScrrenBottomPosY)); m_list.Insert(SelectNum + 1, startBezirPoint);//新しい点追加 //追加前の最後の終了点を追加した最後の開始点とつなげる ここ大事! BezierPoint BezirPoint = new BezierPoint(); BezirPoint = m_list[SelectNum]; BezirPoint.endPoint = m_list[SelectNum + 1].startPoint;//繋ぎなおす m_list[SelectNum] = BezirPoint; //ダブルクリックで選択モードが解除されてるので選択モードに m_SelectMode = SelectMode.SelectStart; //増やした点を選択状態に m_SelectPoint = SelectNum + 1; }
/// <summary> /// 最初の開始点セット /// </summary> /// <param name="y"></param> public int SetFirstStartPoint(int y) { BezierPoint sp = m_list[0]; //最初の点 sp.startPoint.Y = CMath.Clamp(y, ScrrenTopPosY, ScrrenBottomPosY); m_list[0] = sp; return(sp.startPoint.Y); }
/// <summary> /// 最後の終了点の移動 /// </summary> /// <param name="mouse"></param> public void MoveEndPoint(MouseEventArgs mouse) { int LastCnt = m_list.Count() - 1; BezierPoint sp = m_list[LastCnt]; //選択している点 sp.endPoint.Y = CMath.Clamp(mouse.Y, ScrrenTopPosY, ScrrenBottomPosY);; m_list[LastCnt] = sp; }
/// <summary> /// 最後の終了点セット /// </summary> /// <param name="y"></param> public int SetEndPoint(int y) { var LastCnt = m_list.Count() - 1; BezierPoint sp = m_list[LastCnt]; //最後の点 sp.endPoint.Y = CMath.Clamp(y, ScrrenTopPosY, ScrrenBottomPosY); m_list[LastCnt] = sp; return(sp.endPoint.Y); }
/// <summary> /// 制御点2Y /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void ChangeControlPoint2Y(object sender, EventArgs e) { int num = CMath.ChageNomalPosY(numericUpDown6.Value); int num2 = m_CurvePointControl.SetControl2PointY(num); numericUpDown6.Value = CMath.ChageDecimalPosY(num2); if (!m_CurvePointControl.isMoveSelectPoint()) { pictureBox1.Refresh(); //再描画 } }
//入力項目の同期------------------------------------------------------------------------- /// <summary> /// 選択点X /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void ChangeSelectPointX(object sender, EventArgs e) { int num3 = CMath.ChageNomalPosX(numericUpDown1.Value); int num4 = m_CurvePointControl.SetStartPointX(num3); numericUpDown1.Value = CMath.ChageDecimalPosX(num4); if (!m_CurvePointControl.isMoveSelectPoint()) { pictureBox1.Refresh(); //再描画 } }
/// <summary> /// 終了点 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void ChangeEndPoint(object sender, EventArgs e) { int num = CMath.ChageNomalPosY(numericUpDown7.Value); int num2 = m_CurvePointControl.SetEndPoint(num);; numericUpDown7.Value = CMath.ChageDecimalPosY(num2); if (!m_CurvePointControl.isMoveSelectPoint()) { pictureBox1.Refresh(); //再描画 } bp = m_CurvePointControl.GetBezierPoint(); }
/// <summary> /// 点を動かした際同期を取る /// </summary> public void numericUpDownSync() { bp = m_CurvePointControl.GetBezierPoint(); numericUpDown1.Value = CMath.ChageDecimalPosX(bp.startPoint.X); numericUpDown2.Value = CMath.ChageDecimalPosX(bp.controlPoint1.X); numericUpDown3.Value = CMath.ChageDecimalPosX(bp.controlPoint2.X); numericUpDown4.Value = CMath.ChageDecimalPosY(bp.startPoint.Y); numericUpDown5.Value = CMath.ChageDecimalPosY(bp.controlPoint1.Y); numericUpDown6.Value = CMath.ChageDecimalPosY(bp.controlPoint2.Y); numericUpDown7.Value = CMath.ChageDecimalPosY(m_CurvePointControl.GetEndPointY()); numericUpDown8.Value = CMath.ChageDecimalPosY(m_CurvePointControl.GetFirstStartPointY()); }
//保存されている点を描画 public void PaintGraph(PaintEventArgs e) { var pontcnt = m_list.Count(); for (int i = 0; i <= 100; i++) { int x = CMath.ChageNomalPosX((decimal)(0.01f * i)); int y = CMath.ChageNomalPosY(EvaluateY((decimal)(0.01f * i))); //保存されている点を描画 e.Graphics.FillEllipse(m_PointColor, x - m_cpSize / 2, y - m_cpSize / 2, m_cpSize, m_cpSize); } TestPrint(); }
/// <summary> /// 選択点Y /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void ChangeSelectPointY(object sender, EventArgs e) { int num = CMath.ChageNomalPosY(numericUpDown4.Value); int num2 = m_CurvePointControl.SetStartPointY(num); numericUpDown4.Value = CMath.ChageDecimalPosY(num2); if (!m_CurvePointControl.isMoveSelectPoint()) { pictureBox1.Refresh(); //再描画 } //最初の開始点と同期を取る numericUpDown8.Value = CMath.ChageDecimalPosY(m_CurvePointControl.GetFirstStartPointY()); }
/// <summary> /// 制御点2Yセット /// </summary> /// <param name="y"></param> public int SetControl2PointY(int y) { if (m_SelectMode == SelectMode.None) { return(0); } BezierPoint sp = m_list[m_SelectPoint]; sp.controlPoint2.Y = CMath.Clamp(y, ScrrenTopPosY, ScrrenBottomPosY); m_list[m_SelectPoint] = sp; return(sp.controlPoint2.Y); }
/// <summary> /// //座標を0~1の間に変換し文字列化させる /// </summary> /// <param name="bs"></param> /// <returns></returns> public string[] ToSting(CurvePointControl.BezierPoint bs) { //座標を0~1の間に変換し文字列化させる string[] name = new string[4]; name[0] = CMath.ChageDecimalPosX(bs.startPoint.X).ToString() + "," + CMath.ChageDecimalPosY(bs.startPoint.Y).ToString(); name[1] = CMath.ChageDecimalPosX(bs.controlPoint1.X).ToString() + "," + CMath.ChageDecimalPosY(bs.controlPoint1.Y).ToString(); name[2] = CMath.ChageDecimalPosX(bs.controlPoint2.X).ToString() + "," + CMath.ChageDecimalPosY(bs.controlPoint2.Y).ToString(); name[3] = CMath.ChageDecimalPosX(bs.endPoint.X).ToString() + "," + CMath.ChageDecimalPosY(bs.endPoint.Y).ToString(); return(name); }
/// <summary> /// 開始点の移動 /// </summary> /// <param name="mouse"></param> public void MoveStartPoint(MouseEventArgs mouse) { BezierPoint sp = m_list[m_SelectPoint]; //選択している点 sp.startPoint.Y = CMath.Clamp(mouse.Y, ScrrenTopPosY, ScrrenBottomPosY); // 一番最初の開始点だけY軸にしか動かせないように if (!isSelectFirstStartPoint()) { var BeforeSelectPoint = m_SelectPoint - 1; //X軸の移動 intervalPointPosを加算減算すること隣の点と同じ座標にならないようにする int minpx = m_list[BeforeSelectPoint].startPoint.X + intervalPointPos; int maxpx = sp.endPoint.X - intervalPointPos; sp.startPoint.X = CMath.Clamp(mouse.X, minpx, maxpx); //ひとつ前の終了点の移動 BezierPoint sp2 = m_list[BeforeSelectPoint]; sp2.endPoint = sp.startPoint; m_list[BeforeSelectPoint] = sp2; } m_list[m_SelectPoint] = sp; }
/// <summary> /// 制御点1の移動 /// </summary> /// <param name="mouse"></param> public void MoveControl1Point(MouseEventArgs mouse) { BezierPoint sp = m_list[m_SelectPoint]; //選択している点 sp.controlPoint1.X = CMath.Clamp(mouse.X, ScrrenLeftPosX + intervalPointPos, ScrrenRightPosX - intervalPointPos); sp.controlPoint1.Y = CMath.Clamp(mouse.Y, ScrrenTopPosY, ScrrenBottomPosY); //X軸の移動 if (!isSelectFirstStartPoint()) { int minpx = m_list[m_SelectPoint - 1].endPoint.X + ControlOfSetX; sp.controlPoint1.X = CMath.Clamp(sp.controlPoint1.X, minpx, ScrrenRightPosX - 1); } //X軸の移動 if (!(isSelectLastEndPoint())) { int maxpx = m_list[m_SelectPoint + 1].startPoint.X - ControlOfSetX; sp.controlPoint1.X = CMath.Clamp(sp.controlPoint1.X, ScrrenLeftPosX, maxpx); } m_list[m_SelectPoint] = sp; }
/// <summary> /// 文字列から座標に変換 /// </summary> /// <param name="values"></param> CurvePointControl.BezierPoint ToBezierPoint(string[] values) { //文字列を数値に変換 CurvePointControl.BezierPoint bp = new CurvePointControl.BezierPoint(); try { bp.startPoint.X = CMath.ChageNomalPosX(decimal.Parse(values[0])); bp.startPoint.Y = CMath.ChageNomalPosY(decimal.Parse(values[1])); bp.controlPoint1.X = CMath.ChageNomalPosX(decimal.Parse(values[2])); bp.controlPoint1.Y = CMath.ChageNomalPosY(decimal.Parse(values[3])); bp.controlPoint2.X = CMath.ChageNomalPosX(decimal.Parse(values[4])); bp.controlPoint2.Y = CMath.ChageNomalPosY(decimal.Parse(values[5])); bp.endPoint.X = CMath.ChageNomalPosX(decimal.Parse(values[6])); bp.endPoint.Y = CMath.ChageNomalPosY(decimal.Parse(values[7])); } catch (Exception e) { MessageBox.Show(e.Message); Console.WriteLine(e.Message); // エラーメッセージを表示 } return(bp); }
/// <summary> /// 開始点セット /// </summary> /// <param name="y"></param> public int SetStartPointY(int y) { if (m_SelectMode == SelectMode.None) { return(0); } BezierPoint sp = m_list[m_SelectPoint]; //最初の点のY sp.startPoint.Y = CMath.Clamp(y, ScrrenTopPosY, ScrrenBottomPosY); m_list[m_SelectPoint] = sp; //最初の開始点を選択してないなら前の終了点も移動させる if (!isSelectFirstStartPoint()) { var BeforeSelectPoint = m_SelectPoint - 1; BezierPoint sp2 = m_list[BeforeSelectPoint]; sp2.endPoint = sp.startPoint; m_list[BeforeSelectPoint] = sp2; } return(sp.startPoint.Y); }
public void SetList(List <CurvePointControl.BezierPoint> list) { m_list = list; m_Csvlist.Clear(); foreach (CurvePointControl.BezierPoint item in m_list) { CSVPoint cp = new CSVPoint(); cp.startPoint = new decimal[2]; cp.controlPoint1 = new decimal[2]; cp.controlPoint2 = new decimal[2]; cp.endPoint = new decimal[2]; cp.startPoint[0] = CMath.ChageDecimalPosX(item.startPoint.X); cp.startPoint[1] = CMath.ChageDecimalPosY(item.startPoint.Y); cp.controlPoint1[0] = CMath.ChageDecimalPosX(item.controlPoint1.X); cp.controlPoint1[1] = CMath.ChageDecimalPosY(item.controlPoint1.Y); cp.controlPoint2[0] = CMath.ChageDecimalPosX(item.controlPoint2.X); cp.controlPoint2[1] = CMath.ChageDecimalPosY(item.controlPoint2.Y); cp.endPoint[0] = CMath.ChageDecimalPosX(item.endPoint.X); cp.endPoint[1] = CMath.ChageDecimalPosY(item.endPoint.Y); m_Csvlist.Add(cp); } }
/// <summary> /// すべての制御点の位置を整理させる /// </summary> public void OrganizeControlPoint() { int ListMax = m_list.Count(); int LastNum = m_list.Count() - 1; //制御点がいてはいけない場所なら位置を補正する for (int i = 0; i < ListMax; i++) { BezierPoint sp = m_list[i]; //選択している点 //左端以外なら if (i != 0) { sp.controlPoint1.X = CMath.Clamp(sp.controlPoint1.X, m_list[i - 1].endPoint.X + ControlOfSetX, ScrrenRightPosX); sp.controlPoint2.X = CMath.Clamp(sp.controlPoint2.X, m_list[i - 1].endPoint.X + ControlOfSetX, ScrrenRightPosX); } //右端以外なら if (i != LastNum) { sp.controlPoint1.X = CMath.Clamp(sp.controlPoint1.X, ScrrenLeftPosX, m_list[i + 1].startPoint.X - ControlOfSetX); sp.controlPoint2.X = CMath.Clamp(sp.controlPoint2.X, ScrrenLeftPosX, m_list[i + 1].startPoint.X - ControlOfSetX); } m_list[i] = sp; } }