C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 座標変換と画像の移動


(過去ログ 50 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■27522 / inTopicNo.1)  座標変換と画像の移動
  
□投稿者/ B (1回)-(2008/11/08(Sat) 22:08:51)

分類:[C#] 

はじめまして。C#を勉強しはじめて一ヶ月の初心者です。
Microsoft Visual C# 2008 Express Edition を使用しております。

Formにpicturebox1とbutton1を配置し、ボタンを押すたびに前の画像をずらすことによって
黄色の領域がinterbalずつ広がっていくものを書きたいのですが、うまくいきません。
座標変換の部分を消せば思うとおりに動いているのですが。。

どなたかご教授お願いいたします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Bitmap bmp;
        const int interbal = 30;
        const int xMax = 240;
        const int xMin = 0;
        int yMax = 100;
        int yMin = 0;

        float x;
        float y;

        public Form1()
        {
            InitializeComponent();
            bmp_init();
        }

        //ビットマップ初期化
        private void bmp_init()
        {
            //pictureBoxと同じサイズのbitmap生成
            bmp = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);

            //ピクチャボックスに合わせるための値
            x = (float)pictureBox1.Size.Width / (xMax - xMin);
            y = (float)pictureBox1.Size.Height / (yMin - yMax);
        }

        //ビットマップに書く
        private void writebitmap()
        {
            using (Graphics g = Graphics.FromImage(bmp))
            {
                //座標変換
                g.ScaleTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append);
                g.TranslateTransform(xMin, -yMax);

                Bitmap img = new Bitmap(bmp);
                g.DrawImage(img, -interbal, 0);
                g.FillRectangle(Brushes.Yellow, xMax-interbal, 0, interbal, yMax);
            }
            pictureBox1.Invalidate();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            writebitmap();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (bmp != null)
            {
                e.Graphics.DrawImage(bmp, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
            }
        }
    }
}

引用返信 編集キー/
■27523 / inTopicNo.2)  Re[1]: 座標変換と画像の移動
□投稿者/ やじゅ (772回)-(2008/11/08(Sat) 22:18:52)
やじゅ さんの Web サイト
2008/11/08(Sat) 22:23:37 編集(投稿者)

No27522 (B さん) に返信
> Formにpicturebox1とbutton1を配置し、ボタンを押すたびに前の画像をずらすことによって
> 黄色の領域がinterbalずつ広がっていくものを書きたいのですが、うまくいきません。

interbal → interval

> 座標変換の部分を消せば思うとおりに動いているのですが。。

では、消せばいいんじゃないの? どうしたいの?
http://dobon.net/vb/dotnet/graphics/transform.html

引用返信 編集キー/
■27525 / inTopicNo.3)  Re[2]: 座標変換と画像の移動
□投稿者/ B (2回)-(2008/11/08(Sat) 22:39:59)
No27523 (やじゅ さん) に返信
> 2008/11/08(Sat) 22:23:37 編集(投稿者)
>
> では、消せばいいんじゃないの? どうしたいの?
> http://dobon.net/vb/dotnet/graphics/transform.html
>
xMax * yMax そのままの大きさで表示するのではなく
ピクチャボックスに合わせたの大きさに変換したいのです。
引用返信 編集キー/
■27526 / inTopicNo.4)  Re[1]: 座標変換と画像の移動
□投稿者/ 倉田 有大 (332回)-(2008/11/08(Sat) 22:41:37)
> Formにpicturebox1とbutton1を配置し、ボタンを押すたびに前の画像をずらすことによって
> 黄色の領域がinterbalずつ広がっていくものを書きたいのですが、うまくいきません。
> 座標変換の部分を消せば思うとおりに動いているのですが。。

どううまくいかないのか、よくわかりません〜
回答者がソース試すのは手間なので、なるべく楽に回答できるようにおねがいします。

引用返信 編集キー/
■27527 / inTopicNo.5)  Re[2]: 座標変換と画像の移動
□投稿者/ B (3回)-(2008/11/08(Sat) 22:49:19)
No27526 (倉田 有大 さん) に返信

> どううまくいかないのか、よくわかりません〜
> 回答者がソース試すのは手間なので、なるべく楽に回答できるようにおねがいします。
>
申し訳ありません。
私が考えているのは
ボタンを一度押すとピクチャボックスの右端intervalの幅だけ黄色くなり
ふたたびボタンを押すとピクチャボックスの右端からinterval*2の幅黄色くなり、また押せばinterval*3...
という動きですが
実際にははじめの一回はきちんとピクチャボックスの右端intervalの幅だけ黄色くなるのですが
次からはinterval*2の幅よりせまい範囲が塗りつぶされてしまいます。
何度もボタンを押すと黄色い部分の左端がぼやけてきます。
引用返信 編集キー/
■27536 / inTopicNo.6)  Re[3]: 座標変換と画像の移動
□投稿者/ Jitta on the way (216回)-(2008/11/09(Sun) 10:45:43)
No27527 (B さん) に返信

PictureBox にイメージの表示方法を指定するプロパティが有ります。デフォルトだと、なにも操作しないことになっています。そいつを Zoom にしてやれば、座標変換の必要はなくなると思います。
引用返信 編集キー/
■27544 / inTopicNo.7)  Re[4]: 座標変換と画像の移動
□投稿者/ B (4回)-(2008/11/09(Sun) 14:32:10)
No27536 (Jitta on the way さん) に返信

> PictureBox にイメージの表示方法を指定するプロパティが有ります。デフォルトだと、なにも操作しないことになっています。そいつを Zoom にしてやれば、座標変換の必要はなくなると思います。

Jitta on the way さん、ありがとうございます。
確かにPictureBoxSizeModeを使用すればピクチャボックスに合った大きさに変換されることは確認しております。

ただ、今回私の最終的な目標は測定したデータをグラフ表示する(右から左に流す)ことで、
なおかつ取得したデータの値(y軸)によって表示範囲を変化させたいと考えております。

原点を左上から左下に移動させるには、毎回(yMax-yMin)から取得したデータの値を引くということも考えたのですが
煩雑になりそうだったので座標変換を使おうと思いました。

座標変換のところがきちんと理解できていないのだと思いますが、毎回(yMax-yMin)から取得したデータの値を引くということと
座標変換でy軸を−倍してから-yMax移動させることとは等価にはならないのでしょうか?
どのように書けば等価になるのでしょうか?



引用返信 編集キー/
■27549 / inTopicNo.8)  Re[5]: 座標変換と画像の移動
□投稿者/ 倉田 有大 (334回)-(2008/11/09(Sun) 16:35:00)
試してみたけど、うーん!??よくわからないな〜

いい加減な回答ですが、考えてもわからないので、思い切ってかきます。

e.Graphics.DrawImage(bmp, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
これと
e.Graphics.DrawImage(bmp, 0, 0);
これの意味は違いますよ。

上記だと結局PictureBox全体に広げて描画していますので、

//ピクチャボックスに合わせるための値
x = (float)pictureBox1.Size.Width / (xMax - xMin);
y = (float)pictureBox1.Size.Height / (yMin - yMax);

これが役に立っているのでしょうか?
引用返信 編集キー/
■27550 / inTopicNo.9)  Re[6]: 座標変換と画像の移動
□投稿者/ 倉田 有大 (335回)-(2008/11/09(Sun) 16:43:36)
てか、すいません、PictureBoxの大きさが決まっているのならどっちでもいいか。
引用返信 編集キー/
■27553 / inTopicNo.10)  Re[7]: 座標変換と画像の移動
□投稿者/ B (5回)-(2008/11/09(Sun) 17:37:17)
No27550 (倉田 有大 さん) に返信

やじゅさん、倉田 有大 さん、Jitta on the way さん、ありがとうございました。

いろいろ動かしてみて、何となくですが思ったとおりに動かなかった原因がわかりました。
原因は

        //座標変換
                g.ScaleTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append);
                g.TranslateTransform(xMin, -yMax);

                Bitmap img = new Bitmap(bmp);
                g.DrawImage(img, -interbal, 0);
                g.FillRectangle(Brushes.Yellow, xMax-interbal, 0, interbal, yMax);

のところで、座標変換の後に『g.DrawImage(img, -interbal, 0);』があるため、
imgに対してふたたび座標変換をしてしまっていることだと思います。この部分を

                Bitmap img = new Bitmap(bmp);
                g.DrawImage(img, -interbal, 0);

        //座標変換
                g.ScaleTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append);
                g.TranslateTransform(xMin, -yMax);

                g.FillRectangle(Brushes.Yellow, xMax-interbal, 0, interbal, yMax);

とすることにより思ったとおりに動くようになりました。



解決済み
引用返信 編集キー/
■27590 / inTopicNo.11)  Re[5]: 座標変換と画像の移動
□投稿者/ Jitta on the way (220回)-(2008/11/10(Mon) 20:25:39)
No27544 (B さん) に返信
> なおかつ取得したデータの値(y軸)によって表示範囲を変化させたいと考えております。
>
> 原点を左上から左下に移動させるには、毎回(yMax-yMin)から取得したデータの値を引くということも考えたのですが
> 煩雑になりそうだったので座標変換を使おうと思いました。
>
> 座標変換のところがきちんと理解できていないのだと思いますが、毎回(yMax-yMin)から取得したデータの値を引くということと
> 座標変換でy軸を−倍してから-yMax移動させることとは等価にはならないのでしょうか?

それをすると、DrawString で書く文字が、ひっくり返ったりしませんか?
解決済み
引用返信 編集キー/
■27828 / inTopicNo.12)  Re[6]: 座標変換と画像の移動
□投稿者/ B (6回)-(2008/11/15(Sat) 13:45:26)
No27590 (Jitta on the way さん) に返信

> それをすると、DrawString で書く文字が、ひっくり返ったりしませんか?

そうですね、座標変換の後に書いてしまうと上下ひっくり返ってしまうと思います。でも座標変換する前に書いてしまえば大丈夫です。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -