تم حل المشكلة:
قمت باستبدال دالة
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()