الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عمل انعكاس لشكل مرسوم في البرنامج Flipping

بدأه h.shehari في 3 ديسمبر 2012 · 3 رد · 888 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تم حل المشكلة:

قمت باستبدال دالة

g2.rotate(Math.toRadians(180.0));

بدالة

g2.scale(1, -1);

وتم الانعكاس بشكل عمودي مع تغيير موضع رسم الانعكاس ليكون اسفل الصورة الاصلية تماما

--------------------------

السلام عليكم

كنت كتبت استفسار قبل عدة ايام عن مشكلة في تحويل النص الى صورة في برنامج ساعه رقمية (Digital Clock) لأتمكن من رسم الساعه وانعكاسها

على العموم تمكنت من كتابة البرنامج ورسمت الساعه الاولى ورسمت نسخة اخرى منها اسفل منها ولكن واجهتني مشكلة جديده

استخدمت في برنامجي دالة rotate() لكن في الحقيقه اريد انعكاس لصورة الساعه وليس تدوير (انعكاس عمودي)

فهل يوجد دالة لعمل انعكاس عمودي او افقي لشكل مرسوم من نوع Graphics2D

ملاحظة: يوجد في الانترنت الكثير من الامثلة لعكس صورة ولكن لا اريد طريقة انعكاس الصورة انما اريد انعكاس شكل مرسوم بالجافا على سبيل المثال مربع او fillArc او Shape كالمستخدم في برنامجي (Shape mirror)

وهذا هو الكود للبرنامج

import java.awt.*;
import java.awt.font.GlyphVector;
import javax.swing.*;
import java.util.*;

public class DigitalClock extends JFrame implements Runnable {
	/**
	 * @author HASSAN
	 */
	Thread runner; // declare global objects
	Font clockFont;
	Shape mirror;

	public DigitalClock() {
		super("Digital Clock - Hassan Sharaf 12MCMB33");
		setSize(600, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false); // create window
		setLocationRelativeTo(null);
		clockFont = new Font("digifacewide", Font.BOLD, 100); // create font

		Container contentArea = getContentPane();
		ClockPanel timeDisplay = new ClockPanel();
		contentArea.add(timeDisplay); // add components
		setContentPane(contentArea);
		start(); // start thread running
	}

	public class ClockPanel extends JPanel {

		public void paintComponent(Graphics painter) {
			// super.paintComponent(painter);
			Graphics2D g2 = (Graphics2D) painter;
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.setFont(clockFont); // create clock components
			g2.setColor(Color.black);
			g2.drawString(timeNow(), 20, 140);
			GlyphVector v = clockFont.createGlyphVector(getFontMetrics(clockFont).getFontRenderContext(), timeNow());
			mirror = v.getOutline();
			g2.translate(553, 160);
			g2.rotate(Math.toRadians(180.0));	
			g2.fill(mirror);
	        g2.draw(mirror);

		}
	}

	// get current time
	public String timeNow() {
		Calendar now = Calendar.getInstance();
		int hrs = now.get(Calendar.HOUR_OF_DAY);
		int min = now.get(Calendar.MINUTE);
		int sec = now.get(Calendar.SECOND);
		String time = zero(hrs) + ":" + zero(min) + ":" + zero(sec);
		return time;
	}

	public String zero(int num) {
		String number = (num < 10) ? ("0" + num) : ("" + num);
		return number; // Add leading zero if needed
	}

	public void start() {
		if (runner == null) {
			runner = new Thread(this);
		}
		runner.start();
		// method to start thread
	}

	public void run() {
		while (runner == Thread.currentThread()) {
			repaint();
			// define thread task
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				System.out.println("Thread failed");
			}
		}
	}

	// create main method
	public static void main(String[] args) {
		DigitalClock clock = new DigitalClock();
	}

}

وهذه صورة لشكل المخرجات مع استخدام دالة rotate()

https://plus.google.com/photos/101442504710263550552/albums/5817542977227223073?authkey=CLPOiN_I_cGwwAE

تم تعديل هذه المشاركة بواسطة h.shehari في 3 ديسمبر 2012 في 05:51

#2

السلام عليكم

ال Graphics2D لا تدعم الانعكاس بشكل مباشر لذلك يجب علينا استعمل كلاس AffineTransform

اولا يجب ان تعرف مصفوفة الانعكاس حول محور السينات وهي post-258069-024468800 1354637771_thumb.p

هذا الكود لطريقة عمل انعكاس

AffineTransform t = new AffineTransform(1,0,0,-1,0,0);
		g2d.transform(t);
		g2d.drawString("something",0,0);
المرفقات
x-axis.png
#3
Hazem Nassr كتب:

السلام عليكم

ال Graphics2D لا تدعم الانعكاس بشكل مباشر لذلك يجب علينا استعمل كلاس AffineTransform

اولا يجب ان تعرف مصفوفة الانعكاس حول محور السينات وهي post-258069-024468800 1354637771_thumb.p

هذا الكود لطريقة عمل انعكاس

AffineTransform t = new AffineTransform(1,0,0,-1,0,0);
		g2d.transform(t);
		g2d.drawString("something",0,0);

استخدام الدالة التالية اسهل واسرع اعتقد

g2.scale(1, -1);

وشكرا على معلومتك عن AffineTransform وجدت كثير من الامثلة تستخدمها سأقرأ عنها أكثر

#4

السلام عليكم

قد تؤدي دالة scale الغرض لكنها لم تصمم لذلك

طريقة AffineTransform افضل واصح

على فكرة يمكن ان تعمل اي شيئ بالـ AffineTransform من خلال ادخال المصفوفة

مواضيع مشابهة