سؤال

في الأساس ما أحاول القيام به هو أن تدور صورة باستخدام أحداث الماوس. على سبيل المثال ، أثناء الضغط على زر الماوس الأيسر ، تدور الصورة عند تحريك الماوس لأعلى ولأسفل. لقد وجدت سؤالًا آخر هنا مثلني تقريبًا (كيف يمكنني تدوير صورة في C#) ولكن عند تعيين معلمة الزاوية في طريقة الدوران (رمز مصدر الطريقة في الارتباط) إلى الزاوية المحسوبة بين الماوس ومركز الصورة ، أحصل على استثناء في التدفق. الصورة التي أحاول تدويرها في مربع صور. أيه أفكار؟ هل يجب أن أفعل هذا بطريقة أخرى؟

شكرا لك مقدما!

--------- تحرير 1 -----------

حسنًا ، أعتقد أن مثلثتي كانت متوقفة ، لقد غيرتها إلى ...

angle = atan ((mouseposy - ImageCentery)/(mouseposx - ImageCenterx)

ولكن الآن لا تدور الصورة ، فهي تتحرك فقط (قمت ببرمجة القدرة على التحرك بشكل جيد ولكن هذا يعمل بشكل جيد). إليك قطعة الكود التي أتعامل معها.

    private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;

        pbCurrentX = e.X;
        pbCurrentY = e.Y;

    }

    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        // For moving the image
        if (isDragging)
        {
            this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
            this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
        }

        // For rotating the image
        if (rotateMode  && isDragging)
        {
            y2 = e.Y;
            y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
            x2 = e.X;
            x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));

            angle = (float)Math.Atan((y2-y1)/(x2-x1));

            // RotateImage method from the other question linked above
            this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);
        }


    }

يتم ضبط علامة Rotatemode على TRUE عند النقر المزدوج على مربع الصورة. شكرا لكم جميعا!

---------إجابه-----------

بفضل Gabe ، وجدت كل kinks الصغيرة في الكود الخاص بي وهو يعمل بشكل جيد الآن. الشيء الوحيد هو أنني اضطررت إلى جعل حجم مربع الصورة أكبر لتناسب الصورة المدورة. إليك الرمز الصحيح لكل من يريد معرفة الإجابة.

private void pictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;

        pbCurrentX = e.X;
        pbCurrentY = e.Y;

    }

    private void pictureBox_MouseMove(object sender, MouseEventArgs e)
    {

        if (isDragging && !rotateMode)
        {
            this.pictureBox1.Top = this.pictureBox1.Top + (e.Y - pbCurrentY);
            this.pictureBox1.Left = this.pictureBox1.Left + (e.X - pbCurrentX);
        }

        if (rotateMode  && isDragging)
        {
            y2 = e.Y;
            y1 = (this.pictureBox1.Location.Y + (this.pictureBox1.Height / 2));
            x2 = e.X;
            x1 = (this.pictureBox1.Location.X + (this.pictureBox1.Width / 2));

            angle = (float)Math.Atan2((y1 - y2), (x1 - x2));

            pictureBox1.Image =  RotateImage(currentImage, (100*angle));
        } 

    }

    private void pictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;
    }

شكرا غابي والجميع!

هل كانت مفيدة؟

المحلول

هل جربت شيئًا على غرار this.pictureBox1.Image = RotateImage(this.pictureBox1.Image, angle);؟ ال RotateImage الوظيفة التي قمت بربطها بإرجاع صورة مدورة جديدة بدلاً من تدويرها في مكانها كما يتوقع الرمز الخاص بك.

لسوء الحظ ، يؤدي القيام بذلك بتدوير صورة مسجلة بالفعل. ما عليك القيام به هو تخزين الصورة الأصلية في مكان ما ، على سبيل المثال originalImage. ثم لديك this.pictureBox1.Image = RotateImage(originalImage, angle);. وبهذه الطريقة تدور دائمًا نسخة جديدة من الأصل.

نصائح أخرى

دون رؤية الكود الخاص بك ، يمكننا فقط تخمين. أظن أنك تقوم بحساب Trig ، مثل:

theta = Math.Atan((y2 - y1) / (x2 - x1));

إذا كان X2-X1 الخاص بك يتجه نحو 0 ، فإن حجتك إلى Math.atan تتجه نحو اللانهاية ، وتفيض.

angle = atan ((mouseposy - ImageCentery)/(mouseposx - ImageCentery)

انت تستخدم imageCenterY هناك مرتين ، (على الرغم من أنه جيد في الكود الذي نشرته).

على أي حال أود أن أقترح استخدام ATAN2 بدلا من أتان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top