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

عمليات على المثلث

رائج
بدأه علاء الصالحي في 24 يونيو 2008 · 66 رد · 8,526 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#51

أخي علاء

الأمور التنظيمية (بما فيها عملية re factoring و تحديد الأعمال التي يجب القيام بها) نتركها لك فأنت صاحب الموضوع و صاحب الخبرة في المجال

لدي اقتراح (لإعطاء نفس جديد للموضوع):

- إعادة تسمية الموضوع إلى عمليات هندسية في المستوي (ليست على المثلثات فقط)

- توسيع نطاق العمليات إلى أشكال أخرى مثل الدائرة (لأهميتها)

-وضع جدول للأعمال المتبقية (التي يجب القيام بها)..و الأعمال المقترحة

ما رأيك ؟

#52

كلام سليم ,, افضل ان يكون التنسيق من جانبك اخ علاء لكونك صاحب الفكرة وان كان في مجال للمشاركه نبادر جميعا في ذالك ..

وحقا نريد ان تتوسع الافكار في هذا المجال .

سبحان الله , الله اكبر , ولله الحمد

#53

السلام عليكم

كيف حالكم يا شباب؟

أنا لم أقصد الترتيب في كلامي

وإنما التفكير بشكل موجه

بمعنى أي الدوال تصلح لأن تكون على مستوى الفئة

وأي الدوال لن نحتاجها خارج الفئة

وكيف نفصل العمل إلى فئات؟

بالمناسبة أنا قمت بتجهيزها

وها هي الشيفرة

طبعاً قابلة للنقاش والتوضيح

ولا مانع من الأسئلة حتى لو عن أشياء بسيطة

نبدأ بالنقطة

package triangle;

public class Point{
	private final double x;
	private final double y;
	public Point(){
		x = y = 0;
	}
	public Point(double x1, double y1){
		x = x1;
		y = y1;
	}
	public Point(Point p){
		x = p.x;
		y = p.y;
	}
	public double getX(){
		return x;
	}
	public double getY(){
		return y;
	}
	public String toString(){
		return "("+x+","+y+")";
	}
}

الآن الشيفرة الخاصة بالقطعة المستقيمة

بالمناسبة لا أعرف ما اسمها بالإنجليزية لذا سميتها line

package triangle;

public class Line {
	private final Point a,b;

	//  إنشاء قطعة مستقيمة بدلالة نقطتين
	public  Line(Point a,Point b){
		this.a=a;
		this.b=b;
	}
	// ميل المستقيم
	/**
	 * @return
	 * ميل الخط المستقيم
	 */
	public double getSlope() {
		if (b.getX()-a.getX()!=0)
			return (b.getY()-a.getY())/(b.getX()-a.getX()); 
		else
			return Double.MAX_VALUE;
	}
	// معادلة من الشكل
	// y=ax+b
	/**
	 * @return
	 * الجزء المقطوع من محور الصادات
	 */
	public double getYIntersection() {
		double B=a.getY()-getSlope()*a.getX();
		return B;
	}
	/**
	 * @return
	 * طول القطعة المستقيمة
	 */
	public double getLength() {
		return Math.sqrt(getLengthSequare());
	}
	/**
	 * تستخدم هذه الدالة لضمان الدقة عند المقارنة
	 * التي قد تقل عند أخذ الجذر التربيعي
	 * مما قد يؤدي إلى نتائج مغلوطة
	 * @return
	 * مربع طول القطعة المستقيمة
	 */
	public double getLengthSequare() {
		return Math.pow(a.getX()-b.getX(), 2)+Math.pow(a.getY()-b.getY(), 2);
	}
}

أخيراً مع الفئة مثلث

package triangle;

public class Triangle {
	/*
	 * رؤوس المثلث أ ب جـ
	 */
	private final Point a;
	private final Point b;
	private final Point c;
	/*
	 * أضلاع المثلث أ,ب ب,جـ جـ,أ
	 */
	private final Line ab;
	private final Line bc;
	private final Line ca;


	public Triangle(Point a,Point b,Point c) throws NotTriangleException{
		if(!isTriangler(a,b,c))
			throw new NotTriangleException();
		this.a=a;
		this.b=b;
		this.c=c;
		ab=new Line(a,b);
		bc=new Line(b,c);
		ca=new Line(c,a);		
	}

	public static boolean isTriangler(Point a,Point b,Point c) {
		if(a.getX()==b.getX()&&a.getY()==b.getY()
				||a.getX()==c.getX()&&a.getY()==c.getY()
				||c.getX()==b.getX()&&c.getY()==b.getY())//not distnict
			return false;
		Line[] lines=new Line[]{new Line(a,b),new Line(b,c),new Line(c,a)};
		double[] lengths=new double[]{lines[0].getLength(),lines[1].getLength(),lines[2].getLength()};
		if(lengths[0]==lengths[1]+lengths[2]||
				lengths[1]==lengths[0]+lengths[2]||
				lengths[2]==lengths[1]+lengths[0])//parallel
			return false;
		return true;
	}

	public double[] lengths() {
		double lengths[]=new double[3];
		lengths[0]=ab.getLength();
		lengths[1]=bc.getLength();
		lengths[2]=ca.getLength();		
		return lengths;
	}

	private double[] lengthsSequare() {
		double lengths[]=new double[3];
		lengths[0]=ab.getLengthSequare();
		lengths[1]=bc.getLengthSequare();
		lengths[2]=ca.getLengthSequare();		
		return lengths;
	}

	public String isScalene() {
		double lengths[]=lengthsSequare();
		if( lengths[0] != lengths[1]
		 && lengths[1] != lengths[2]
		 && lengths[0] != lengths[2])
			return "scalene";
		else
			return "isosceles";
	}

	public String classify() {
		double lengths[]=lengthsSequare();
		double A=lengths[0];
		double B=lengths[1];
		double C=lengths[2];
		double D=lengths[1]+lengths[2];
		double E=lengths[0]+lengths[2];
		double F=lengths[1]+lengths[0];
		if( A == D || B == E || C == F )
			return "right";
		else if( A > D || B > E || C > F )
			return "obtuse";
		else
			return "acute";
	}
	/**
	 * test the point in, on or out the triangle
	 * @param point
	 * @return
	 * 1:in
	 * 0:on
	 * -1:out
	 */
	public int pointPosition(Point point){
		double c1,c2,c3;

		c1 = ((b.getY()-a.getY())*(point.getX()-a.getX())
				-(b.getX()-a.getX())*(point.getY()-a.getY())) * ((b.getY()-a.getY())*(c.getX()-a.getX())
						-(b.getX()-a.getX())*(c.getY()-a.getY()));
		c2= ((c.getY()-a.getY())*(point.getX()-a.getX())
				-(c.getX()-a.getX())*(point.getY()-a.getY())) * ((c.getY()-a.getY())*(b.getX()-a.getX())
						-(c.getX()-a.getX())*(b.getY()-a.getY()));
		c3= ((c.getY()-b.getY())*(point.getX()-b.getX())
				-(c.getX()-b.getX())*(point.getY()-b.getY())) * ((c.getY()-b.getY())*(a.getX()-b.getX())
						-(c.getX()-b.getX())*(a.getY()-b.getY()));

		if((c1>0)&&(c2>0)&&(c3>0)) 
			return 1;
		else if((c1<0)||(c2<0)||(c3<0)) 
			return -1;
		else
			return 0;
	}
	public static void main(String[] args) {
		for (int i = 1; i < args.length; i++) {
			double x1=Double.parseDouble(args);
			i++;
			double y1=Double.parseDouble(args);
			i++;
			double x2=Double.parseDouble(args);
			i++;
			double y2=Double.parseDouble(args);
			i++;
			double x3=Double.parseDouble(args);
			i++;
			double y3=Double.parseDouble(args);
			try{
			Triangle t=new Triangle(new Point(x1,y1),new Point(x2,y2),new Point(x3,y3));		
			StringBuilder s=new StringBuilder(" triangle");
			s.insert(0," " + t.classify());
			s.insert(0,t.isScalene());
			System.out.println(s.toString());
			}
			catch (NotTriangleException e) {
				System.out.println("not a triangle");
			}
			System.out.println();
		}
	}
}

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#54

العمليات (على المثلث) التي أقترح إضافتها

1/ تقاطع مثلث مع آخر

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

1/ مثلثين منفصلين تماما

2/ متقاطعين في نقطة واحد (رأس أحد المثلثين مع ضلع (أو رأس) الآخر)

3/ متقاطعين في نقطتين (أحد رؤوس المثلث يقع داخل المثلث الثاني)

4/ متقاطعين في أربعة نقاط

5/ مشتركين في ضلع

6/ مشتركين في ضلعين

7/ مشتركين في ثلاثة أضلاع (متطابقين)

8/ مثلث داخل الآخر

ربما ليست كل الحالات مهمة ... باب النقاش مفتوح

2/ حساب مركز ثقل المثلث المساحة و المحيط

3/ إضافة Constructor إضافية (تم طرحها من قبل )

تم تعديل هذه المشاركة بواسطة djug في 23 أغسطس 2008 في 14:56

#55

السلام عليكم

جيد djug

أفكار جميلة جداً

وبالمناسبة صعبة بعض الشيء

1- ليس لدي فكرة عنها

2- أسهل واحد فيهم المحيط والذي يساوي مجموع الأضلاع

يليه مركز الثقل والذي يمكن حسابه بحساب النقطة المتوسطة لكل ضلع

ثم توصيل خط بين الخطوط

ومساواة المعادلات مع بعضها

المساحة تساوي نصف القاعدة في الإرتفاع

لكني نسيت كيف أوجد معادلة العمودي عليه

3- ما الذي تقترحه؟؟

يبدو أن سنستدعي الأخ عماد مرة أخرى

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#56

تشكر اخ علاء على هذا التنسيق .

إضافة : class line

الجزء المقطوع من محور السينات .

... 
public double getXIntersection() {
	double B=-getYIntersection()/a.getXslope();
		return B;
	}
...

الان ما رايك اخ علاء ان ننتقل الى الجزء الذي ذكره اخونا djug

سبحان الله , الله اكبر , ولله الحمد

#57

لدي بعض الأفكار لنبدأ بها:

1/مثلثين منفصلين تماما

إذا كانت الرؤوس الثلاث لكل مثل تقع خاج المثلث الآخر

2/تقاطع المثلثات

نحلها بطريقة تقاطع المستقيمات

مستقيمان متقاطعان إذا كان هناك حل وحيد لفرق معادلتيها:

معادلة الأول-معادلة الثاني=0

-إذا وجدنا حلا واحدا فإن المستقيمين متقاطعين

-إذا لم نجد حلا فالمستقمين غير متقاطعين (متوازيين)

-إذا كانت هناك مالانهاية من الحلول فالمستقيمين متطابقين

3/ مثلث داخل آخر

إذا كانت جميع رؤوسه داخل المثلث الآخر

اقتباس
- ما الذي تقترحه؟؟

يبدو أن سنستدعي الأخ عماد مرة أخرى

طبعا ..

#58

هذه الدالة سوف تساعدنا في بعض هذه المسائل : pointPosition();

" يحتاج الامر الى دراسه "

اعتقد تحتاج الدالة pointPosition(); الى توسعه .

تم تعديل هذه المشاركة بواسطة azeez00 في 22 أغسطس 2008 في 21:04

سبحان الله , الله اكبر , ولله الحمد

#59

السلام عليكم

العفو أخ عزيز

اقتباس
إضافة : Class line الجزء المقطوع من محور السينات .

هل سنستفيد منها؟؟

أنا وضعت الجزء المقطوع من محور الصادات

لأنه يدخل بشكل كبير في معادلة الخط المستقيم

حتى أني أفكر بإزالته لأني أتحدث عن قطعة مستقيمة

وليس خط مستقيم

أخ djug

ممممممممم

يبدو لي أن هناك مشكلة في الحل

معادلة الخط المستقيم لن تحل المشكلة

لأنا نتكلم عن قطعة مستقيمة وليس خط مستقيم

بمعنى أن الخط المستقيم يستمر إلى ما لانهاية

والقطعة المستقيمة تتوقف عند نقطة معينة

بالطبع إذا أمكننا أن نعرف هل النقطة هذه خارج القعطة المستقيمة أم داخلها

هل ترى مشكلة في ما أقول

سنرى ما لدى الأخ عماد

أخ عزيز

ما الذي تقصده بتوسعة الدالة؟؟

وضح أكثر

تحياتي

تم تعديل هذه المشاركة بواسطة alaadiaa في 23 أغسطس 2008 في 06:06

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#60

معادلة قطعة مستقيمة (إن جاز قول ذلك):

معادلة المستقيم الحامل لهذه القطعة+ تحديد المجال الذي تنتم إليه السينات

مثلا

2X+3Y-1=0

ْX ينتمي إلى [5,10]

#61

معاك حق أخ djug

هذه فاتتني

طيب ما الذي تبقى لنا؟؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#62
alaadiaa كتب:
طيب ما الذي تبقى لنا؟؟

تتبقى موافقة الأخ عماد

و صياغته للحلول بطريقته الجميلة (الحل في أسطر و كلمات قليلة)

#63
اقتباس
هل سنستفيد منها؟؟

أنا وضعت الجزء المقطوع من محور الصادات

لأنه يدخل بشكل كبير في معادلة الخط المستقيم

حتى أني أفكر بإزالته لأني أتحدث عن قطعة مستقيمة

وليس خط مستقيم

لا اعلم حقا هل نستفيد منها اولا مستقبلا .. لكن لعل وعسى نحتاجها مستقبلا .

اما بالنسبة للدالة "الجزء المقطوع من محور الصادات" حتما لا يمكن الاستغناء عنها في تصوري .. لاننا لا انستطيع اخراج النقطة القاطعة بين مستقيمين الا بهذه الدالة ..

مثال :

اخرج نقطة التقاطع بين مستقيمين للمثلث A و B :

A.L1.getYintersect() = ai

B.L1.getYintersect() = bi

A.L1.getSlope() = as

B.L1.getSlope() = bs

المعادلة الراجعه لاخراج المحور السيني للنقطة =

-(ai-bi)/(as-bs)=x

اما المحور الصادي فهو التعويض في اي معادله مستقيم للمستقيمين.

y =   A.L1.getSlope() *(x)+A.L1.getYintersect()

اما بخصوص التوسعة للدالة pointPostion (); اقصد انها سوف يتم البحث عن نقاط المثلث اذا كان هناك حل في هذه الطريقة , وسوف يتم ادخال ثلاث بارمترات بدلا من واحد . طبعا ليس الان ننتظر مشاركة الاخ عماد ربما يغنينا عن الحلول الطويلة .

سبحان الله , الله اكبر , ولله الحمد

#64

السلام عليكم ورحمة الله

اخوانى الافاضل شاكر لكم هذه الثقه الغالية. واسف على التاخير , ولكنى شغلت بموضوع دستور الفريق العربى للبرمجه , ونسيت المشاركة معكم :)

ان شاء الله احاول غدا قراءة مافاتنى بتركيز , وارى ما يمكننى فعله وربنا يستر :)

بالله التوفيق ,,,

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#65

في انتظارك أخ عماد

نعتذر عن إزعاجك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#66

نور الموضوع اخ عماد

سبحان الله , الله اكبر , ولله الحمد

#67

اخواني انا لاحظت ان المثلث عندما ينفصل عن المثلث الاخرى يمكن ان يتقاطع مع خطين او خط واحد ولكن لا يمكن ان يتقاطع مع الخطوط جميعها.

هل هذا صحيح ؟

ارجوا الافادة .

تم تعديل هذه المشاركة بواسطة azeez00 في 31 أغسطس 2008 في 00:52

سبحان الله , الله اكبر , ولله الحمد

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