質問編集履歴

7

追記

2018/08/13 02:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -463,3 +463,193 @@
463
463
 
464
464
 
465
465
  このようにもしてみたのですが、うまくいきませんでした...
466
+
467
+
468
+
469
+ -追記-
470
+
471
+
472
+
473
+ 現在のコードと、現在回転させるとどうなるかの画像を追記します。
474
+
475
+
476
+
477
+ ```typescript
478
+
479
+ //拡張子は.vueです
480
+
481
+
482
+
483
+ <template>
484
+
485
+
486
+
487
+ <div class="rotate-area">
488
+
489
+ <div class="rotate">
490
+
491
+
492
+
493
+ <svg width="608" height="408" viewBox="0 0 608 408" xmlns="http://www.w3.org/2000/svg" class="svg" ref="svg">
494
+
495
+
496
+
497
+ <g stroke-width="1" fill="#ffffff" fill-rule="evenodd" fill-opacity="0" stroke="#000000" class="shape">
498
+
499
+
500
+
501
+ <g fill-opacity="1">
502
+
503
+ <rect :transform="getAngle" stroke-width="2" fill-opacity="0" :x="64" :y="65" :width="189" :height="46"></rect>
504
+
505
+
506
+
507
+ <rect fill="#FAFAFA" :x="leftTopX" :y="leftTopY" width="7" height="7"></rect>
508
+
509
+ <rect fill="#FAFAFA" :x="rightTopX" :y="rightTopY" width="7" height="7"></rect>
510
+
511
+ <rect fill="#FAFAFA" :x="rightBottomX" :y="rightBottomY" width="7" height="7"></rect>
512
+
513
+ <rect fill="#FAFAFA" :x="leftBottomX" :y="leftBottomY" width="7" height="7"></rect>
514
+
515
+
516
+
517
+ <!--<rect :x="getMiddleX" :y="getMiddleY" width="7" height="7" rx="3.5"></rect>-->
518
+
519
+ </g>
520
+
521
+ </g>
522
+
523
+
524
+
525
+ </svg>
526
+
527
+
528
+
529
+ </div>
530
+
531
+
532
+
533
+ <button @click="rotate">30°回転</button>
534
+
535
+
536
+
537
+ </div>
538
+
539
+ </template>
540
+
541
+
542
+
543
+ <script lang="ts">
544
+
545
+ import { Component, Prop, Vue } from "vue-property-decorator";
546
+
547
+ import { RSA_NO_PADDING } from "constants";
548
+
549
+
550
+
551
+ @Component({
552
+
553
+ components: {}
554
+
555
+ })
556
+
557
+ export default class Rotate extends Vue {
558
+
559
+ leftTopX = 60.5;
560
+
561
+ leftTopY = 60.5;
562
+
563
+ rightTopX = 249.5;
564
+
565
+ rightTopY = 60.5;
566
+
567
+ rightBottomX = 249.5;
568
+
569
+ rightBottomY = 108.5;
570
+
571
+ leftBottomX = 60.5;
572
+
573
+ leftBottomY = 108.5;
574
+
575
+
576
+
577
+ get getMiddleX() {
578
+
579
+ return (this.leftTopX + this.rightTopX) / 2;
580
+
581
+ }
582
+
583
+
584
+
585
+ get getMiddleY() {
586
+
587
+ return (this.leftTopY + this.leftBottomY) / 2;
588
+
589
+ }
590
+
591
+
592
+
593
+ angle = 0;
594
+
595
+
596
+
597
+ get getAngle() {
598
+
599
+ return "rotate(" + this.angle + "," + 155 + "," + 84.5 + ")";
600
+
601
+ }
602
+
603
+
604
+
605
+ rotate() {
606
+
607
+ this.angle = 30;
608
+
609
+
610
+
611
+ let leftTopXBefore = this.leftTopX;
612
+
613
+ let leftTopYBefore = this.leftTopY;
614
+
615
+
616
+
617
+ let middleX = this.getMiddleX;
618
+
619
+ let middleY = this.getMiddleY;
620
+
621
+
622
+
623
+ let radians = this.angle * (Math.PI / 180);
624
+
625
+
626
+
627
+ this.leftTopX =
628
+
629
+ (leftTopXBefore + middleX) * Math.cos(radians) -
630
+
631
+ (-leftTopYBefore + -middleY) * Math.sin(radians) -
632
+
633
+ middleX;
634
+
635
+
636
+
637
+ }
638
+
639
+
640
+
641
+ }
642
+
643
+ </script>
644
+
645
+
646
+
647
+ <style lang="scss">
648
+
649
+ </style>
650
+
651
+ ```
652
+
653
+
654
+
655
+ ![イメージ説明](384768e0c4837ebce1cd3a7c1aaab0a7.png)

6

追記、誤字修正

2018/08/13 02:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -182,11 +182,11 @@
182
182
 
183
183
  これを座標の変化で表現したいのですがうまくいきません...。
184
184
 
185
- まず一番大きい四角は回転させるしかないとして、その一番大きい四角の頂点となる四角を座標の変化で処理したいです...。
185
+ まず一番大きい四角は回転させるしかないとして、その一番大きい四角の頂点となる四つの四の変化を座標の変化で処理したいです...。
186
186
 
187
187
  試してみたのが、以下の方法です。
188
188
 
189
- こちらの方法ではrotateはgタグじゃなくて一番大きい四角にバインドしてます。
189
+ こちらの方法ではrotateはgタグじゃなくて一番大きい四角にのみバインドしてます。
190
190
 
191
191
 
192
192
 
@@ -380,7 +380,7 @@
380
380
 
381
381
 
382
382
 
383
- よくよく考えたら上記方法だと、大きい四角の位置もあうれてしまう
383
+ よくよく考えたら上記方法だと、大きい四角の位置もれてしまう
384
384
 
385
385
 
386
386
 
@@ -396,11 +396,11 @@
396
396
 
397
397
 
398
398
 
399
- なのでもうここは数字を直接書きました。
399
+ なのでここは数字を直接書きました。
400
-
401
-
402
-
400
+
401
+
402
+
403
- あとrotateの関数内で座標を変更してからその変更した座標を使って計算するとうので、一度let leftTopXBefore = this.leftTopXのような形で格納するようにしました。
403
+ あとrotateの関数内で座標を変更してからその変更した座標を使って計算すると計算がくるうので、一度let leftTopXBefore = this.leftTopXのような形で格納するようにしました。
404
404
 
405
405
 
406
406
 

5

追記

2018/08/13 02:36

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -441,3 +441,25 @@
441
441
 
442
442
 
443
443
  }
444
+
445
+
446
+
447
+ -追記-
448
+
449
+
450
+
451
+ y座標が上から下に向かって加算されるので、このような計算をする上での実際の座標はマイナスだと思い
452
+
453
+
454
+
455
+ this.leftTopX =
456
+
457
+ (leftTopXBefore + middleX) * Math.cos(radians) -
458
+
459
+ (-leftTopYBefore + -middleY) * Math.sin(radians) -
460
+
461
+ middleX;
462
+
463
+
464
+
465
+ このようにもしてみたのですが、うまくいきませんでした...

4

追記

2018/08/05 15:57

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -373,3 +373,71 @@
373
373
  </style>
374
374
 
375
375
  ```
376
+
377
+
378
+
379
+ -追記-
380
+
381
+
382
+
383
+ よくよく考えたら上記方法だと、大きい四角の位置もあうれてしまう
384
+
385
+
386
+
387
+ get getAngle(){
388
+
389
+ return "rotate(" + this.angle + "," + this.getMiddleX + "," + this.getMiddleY + ")"
390
+
391
+ }
392
+
393
+
394
+
395
+ で、this.getMiddleXとかの値も変わってしまうから
396
+
397
+
398
+
399
+ なのでもうここは数字を直接書きました。
400
+
401
+
402
+
403
+ あとrotateの関数内で座標を変更してからその変更した座標を使って計算すると狂うので、一度let leftTopXBefore = this.leftTopXのような形で格納するようにしました。
404
+
405
+
406
+
407
+ さらに、式も間違えていたように思えたので他記事からの引用で以下のようにしました...
408
+
409
+ うまくいきませんが、どうでしょうか...(T___T)
410
+
411
+
412
+
413
+ rotate(){
414
+
415
+ this.angle = 30
416
+
417
+
418
+
419
+ let leftTopXBefore = this.leftTopX
420
+
421
+ let leftTopYBefore = this.leftTopY
422
+
423
+
424
+
425
+ let middleX = this.getMiddleX
426
+
427
+ let middleY = this.getMiddleY
428
+
429
+
430
+
431
+ //let radians = this.angle * (Math.PI/180)
432
+
433
+
434
+
435
+ this.leftTopX = (leftTopXBefore + middleX) * Math.cos(this.angle) - (leftTopYBefore + middleY) * Math.sin(this.angle) - middleX
436
+
437
+ this.leftTopY = (leftTopXBefore + middleX) * Math.sin(this.angle) + (leftTopYBefore + middleY) * Math.cos(this.angle) - middleY
438
+
439
+
440
+
441
+
442
+
443
+ }

3

コメント追加

2018/08/05 13:10

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -342,6 +342,8 @@
342
342
 
343
343
 
344
344
 
345
+ //↓例えばこれは左上の四角のx座標に対する処理なんですけどうまくいかないです
346
+
345
347
  this.leftTopX = (this.leftTopX + middleX) * Math.cos(radians) - (this.leftTopY+middleY) * Math.sin(radians)
346
348
 
347
349
 

2

画像位置変更

2018/08/05 12:31

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,9 @@
1
+ ![](10b660bcac153bf25cd11ff2b4ff0830.png)
2
+
3
+
4
+
5
+
6
+
1
7
  四角の各頂点に小さい四角があるsvgの回転を、各頂点の座標を動かすことで実現したいです...。
2
8
 
3
9
  まず以下が、普通にrotateで処理している場合です。
@@ -365,7 +371,3 @@
365
371
  </style>
366
372
 
367
373
  ```
368
-
369
-
370
-
371
- ![こんな感じです](10b660bcac153bf25cd11ff2b4ff0830.png)

1

画像の追加

2018/08/05 09:24

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -365,3 +365,7 @@
365
365
  </style>
366
366
 
367
367
  ```
368
+
369
+
370
+
371
+ ![こんな感じです](10b660bcac153bf25cd11ff2b4ff0830.png)