//ネイティブ位置からコントロール位置を再計算して設定 private void UpdateControlLocation() { Point pixelLocation = EtCourseScaler.NativeToPixelInvY(nativeLocation); pixelLocation.Offset(-pixelLocationOffset.X, -pixelLocationOffset.Y); this.Location = pixelLocation; }
/** * すべての軌跡を描画し、画像として保存する。 */ public void SaveAllTrack(string fileName) { //ファイルが閉じている if (playStatus == PlayStatus.Close) { throw new NxtLogFileNotOpenedException("ログファイルが開かれていません。"); } //ログの最後 int last = nxtTrackLog.Length - 1; //保存対象のBitmapを生成 Size courseImageSize = EtCourseScaler.GetPixelCourseSize(); Bitmap trackImage = new Bitmap(courseImageSize.Width, courseImageSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(trackImage); //ベース(コース)描画 g.DrawImage(courseImage, 0, 0); //軌跡描画--------- Point startPoint = EtCourseScaler.NativeToPixelInvY(nxtTrackLog.getLog(last).point); //最初の一点は必ず描画するため、開始座標を+1する startPoint.Offset(new Point(1, 1)); Point endPoint; //色作成 Pen linePen = new Pen(TRACK_LINE_COLOR, TRACK_LINE_WIDTH); for (int i = last; i >= 0; i--) { endPoint = EtCourseScaler.NativeToPixelInvY(nxtTrackLog.getLog(i).point); //描画 g.DrawLine(linePen, startPoint, endPoint); startPoint = endPoint; } //保存 trackImage.Save(fileName, ImageFormat.Png); }
/** * コースビューの表示を更新する。 */ public void UpdateView() { Debug.WriteLine("UpdateView()"); Graphics g = Graphics.FromImage(renderTarget); //ファイルが閉じている if (playStatus == PlayStatus.Close) { //ベース(コース)のみ描画 g.DrawImage(courseImage, 0, 0); } else { //ベース(コース)描画 g.DrawImage(courseImage, 0, 0); //軌跡を描画------------------------------------------------------- Point startPoint = EtCourseScaler.NativeToPixelInvY(nxtTrackLog.getLog(playPosition).point); //最初の一点は必ず描画するため、開始座標を+1する startPoint.Offset(new Point(1, 1)); Point endPoint; int trackCount = 0; //何ログ分まで描いたかをカウント for (int i = playPosition; i >= 0; i--) { //規定数分描いたらやめる if (trackCount >= TRACK_COUNT) { break; } endPoint = EtCourseScaler.NativeToPixelInvY(nxtTrackLog.getLog(i).point); //色作成 Pen gpsLinePen = new Pen(Color.FromArgb((int)(255 - (trackCount * (255 / (double)TRACK_COUNT))), TRACK_LINE_COLOR), TRACK_LINE_WIDTH); //描画 g.DrawLine(gpsLinePen, startPoint, endPoint); startPoint = endPoint; trackCount++; } } //制御線を描画---------------------------------------------------------- int pointCount = controlPointList.Count; Pen controlLinePen = new Pen(CONTROL_LINE_COLOR, CONTROL_LINE_WIDTH); //制御点が一つ以上あれば開始点・終了点に丸をつける if (pointCount > 0) { //終了点 g.FillEllipse(new SolidBrush(Color.White), controlPointList[pointCount - 1].ScaledLocation.X - 11, controlPointList[pointCount - 1].ScaledLocation.Y - 11, 20, 20); g.DrawEllipse(new Pen(Color.Red, 2), controlPointList[pointCount - 1].ScaledLocation.X - 11, controlPointList[pointCount - 1].ScaledLocation.Y - 11, 20, 20); //開始点 g.FillEllipse(new SolidBrush(Color.White), controlPointList[0].ScaledLocation.X - 9, controlPointList[0].ScaledLocation.Y - 9, 16, 16); g.DrawEllipse(new Pen(Color.Blue, 2), controlPointList[0].ScaledLocation.X - 9, controlPointList[0].ScaledLocation.Y - 9, 16, 16); } //制御点が2個以上なら線を描く if (pointCount > 1) { //二制御点間に線を引く for (int i = 0; i < (pointCount - 1); i++) { g.DrawLine( controlLinePen, controlPointList[i].ScaledLocation, controlPointList[i + 1].ScaledLocation); } } //表示更新 if (coursePicture.Image == null) { coursePicture.Image = renderTarget; } coursePicture.Refresh(); }