質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2356閲覧

ある点を中心に拡大・縮小するにはどうすればよいでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/17 12:59

下のソースコードはSDL2で青色の四角形を描画するもので、マウスホイールで拡大縮小することができます。
しかし拡大縮小する際にカメラ(視点)の位置を変更していないため不格好なズームになってしまいます。
マウスの座標を中心に拡大縮小するにはどのようにすればよいでしょうか?
(SDL2でなくてもよいのですが下のTODOを埋める形で教えていただけるとありがたいです)

cpp

1#include <SDL2/SDL.h> 2 3const int WIDTH = 600; 4const int HEIGHT = 400; 5 6struct Camera { 7 // xとyは視点の左上の座標 8 float x, y, zoom; 9}; 10 11int main() { 12 SDL_Init(SDL_INIT_VIDEO); 13 14 auto window = SDL_CreateWindow("zoom test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 15 WIDTH, HEIGHT, SDL_WINDOW_SHOWN); 16 auto renderer = 17 SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 18 19 Camera camera{0.0, 0.0, 1.0}; 20 const SDL_FRect rect{100, 100, 100, 100}; 21 SDL_Event e; 22 bool quit = false; 23 24 while (!quit) { 25 while (SDL_PollEvent(&e)) { 26 if (e.type == SDL_QUIT) { 27 quit = true; 28 break; 29 } else if (e.type == SDL_MOUSEWHEEL) { 30 // 上スクロールで2倍に拡大 31 // 下スクロールで1/2倍に縮小 32 33 // zoomの更新 34 // e.wheel.yは上スクロールで正、下スクロールで負となる 35 float zoom_rate = e.wheel.y > 0 ? 2.0 : 1.0 / 2.0; 36 camera.zoom *= zoom_rate; 37 38 // マウスの座標 39 int mx, my; 40 SDL_GetMouseState(&mx, &my); 41 // TODO: camera.xとcamera.yをどのように更新すればよいでしょうか?? 42 } 43 } 44 // 黒で塗りつぶし 45 SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); 46 SDL_RenderClear(renderer); 47 48 // 青色の四角形 49 SDL_SetRenderDrawColor(renderer, 0, 0, 200, 255); 50 SDL_FRect drawed_rect = {rect.x - camera.x, rect.y - camera.y, rect.w * camera.zoom, 51 rect.h * camera.zoom}; 52 SDL_RenderFillRectF(renderer, &drawed_rect); 53 54 SDL_RenderPresent(renderer); 55 } 56 57 SDL_DestroyRenderer(renderer); 58 SDL_DestroyWindow(window); 59 SDL_Quit(); 60} 61 62

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

  1. 対象である座標 から マウス座標 を引く
  2. 対象である座標 をxx倍する
  3. 対象である座標 に マウス座標 を足す

ってやれば、マウス座標を中心にxx倍されますやろ。

投稿2020/01/17 13:49

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問