المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: عمليات على المثلث
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات لغات البرمجة العام > منتدى مبرمجي لغة جافا JAVA
صفحات: 1, 2
علاء الصالحي
هذا برنامج بسيط للمبتدئين
البرنامج يأخذ 6 مدخلات والتي تمثل الإحداثايات الخاصة بنقاط المثلث
كود
(x1,y1)

(x2,y2)

(x3,y3)

العمليات التي قمت بتصميمها
أ- هل الشكل يمثل مثلث
بالطبع النقاط الثلاث تمثل مثلت إلا في حالتين
1- تكرار نقطة
كأن تكون النقطة الثانية والثالثة بنفس الإحداثيات
2- أن تكون الثلاث نقاط على خط واحد
ب- أطوال الأضلاع
واستخدمت في هذه العملية المسافة الإقليدية لحساب الأضلاع
حسب المعادة التالية
إذا كان x يمثل المسافة بين النقطة الأولى والثانية
كود
x=sqrt(pow(x1-x2,2)+pow(y1-y2))


ج- تصنيف المثلث إذا كان متطابق الضلعين
في هذه العملية أقوم بفحص الضلع
أقوم باستخدام العملية السابقة
وأقارن بين أطوال الأضلاع

د- تصنيف المثلثات على حسب زواياه
المثلث ينقسم على حسب زواياه إلى ثلاثة أقسام
إذا كان يحتوي على زاوية منفرجة فهو منفرج
إذا كان يحتوي على زاويه قائمة فهو قائم
وإلا فهو حاد
يكون المثلث منفرج
إذا كان مربع أحد الأضلاع أكبر من مبربعي الضلعين الآخرين
يكون المثلث قائم (نظرية فيثاغورث)
إذا كان مربع أحد الأضلاع يساوي مربعي الضلعين الآخرين
ويكون حاد إذا لم يتوفر أحد الشرطين السابقين

البرنامج يأخذ المدخلات من شاشة الدوس
ويأخذ أي عدد من المثلثات
بالطبع كل مثلث يتمثل في 6 مدخلات
مثال على المدخلات
0 0 0 4 1 2
1 1 1 4 3 2
2 2 2 4 4 3
3 3 3 4 5 3
4 4 4 5 5 6
5 5 5 6 6 5
6 6 6 7 6 8
7 7 7 7 7 7

أترككم مع الشيفرة
كود
package triangle;

public class Triangle {
    private double x1;
    private double x2;
    private double x3;
    private double y1;
    private double y2;
    private double y3;
    
    public Triangle(double x1,double y1,double x2,double y2,double x3,double y3){
        this.x1=x1;
        this.x2=x2;
        this.x3=x3;
        this.y1=y1;
        this.y2=y2;
        this.y3=y3;
    }
    public boolean isTriangler() {
        if(x1==x2&&y1==y2||x1==x3&&y1==y3||x3==x2&&y3==y2)//not distnict
            return false;
        double[] lengths=lengths();
        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]=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
        lengths[1]=Math.sqrt(Math.pow(x2-x3, 2)+Math.pow(y2-y3, 2));
        lengths[2]=Math.sqrt(Math.pow(x3-x1, 2)+Math.pow(y3-y1, 2));        
        return lengths;

    }
    public String isScalene() {
        double lengths[]=lengths();
        if(lengths[0]!=lengths[1]&&lengths[1]!=lengths[2]&&lengths[0]!=lengths[2])
            return "scalene";
        else
            return "isosceles";
    }
    public String classify() {
        double lengths[]=lengths();
        double A=Math.floor(Math.pow(lengths[0], 2)+.00005);
        double B=Math.floor(Math.pow(lengths[1], 2)+.00005);
        double C=Math.floor(Math.pow(lengths[2], 2)+.00005);
        double D=Math.floor(Math.pow(lengths[1], 2)+Math.pow(lengths[2], 2)+.00005);
        double E=Math.floor(Math.pow(lengths[0], 2)+Math.pow(lengths[2], 2)+.00005);
        double F=Math.floor(Math.pow(lengths[1], 2)+Math.pow(lengths[0], 2)+.00005);
        System.out.println(A+"="+D);
        System.out.println(B+"="+E);
        System.out.println(C+"="+F);
        if(A==D||B==E||C==F)
            return "right";
        else if(Math.pow(lengths[0], 2)>Math.pow(lengths[1], 2)+Math.pow(lengths[2], 2)
                ||Math.pow(lengths[1], 2)>Math.pow(lengths[0], 2)+Math.pow(lengths[2], 2)
                ||Math.pow(lengths[2], 2)>Math.pow(lengths[1], 2)+Math.pow(lengths[0], 2))
            return "obtuse";
        else
            return "acute";
    }
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            double x1=Double.parseDouble(args[i]);
            i++;
            double y1=Double.parseDouble(args[i]);
            i++;
            double x2=Double.parseDouble(args[i]);
            i++;
            double y2=Double.parseDouble(args[i]);
            i++;
            double x3=Double.parseDouble(args[i]);
            i++;
            double y3=Double.parseDouble(args[i]);
            Triangle t=new Triangle(x1,y1,x2,y2,x3,y3);
            double[] lengths=t.lengths();
            for (int j = 0; j < lengths.length; j++) {
                System.out.println(lengths[j]+" ");
            }
            System.out.println();
            if(t.isTriangler()){
                StringBuilder s=new StringBuilder(" triangle");
                s.insert(0," " + t.classify());
                s.insert(0,t.isScalene());
                System.out.println(s.toString());
            }
            else
                System.out.println("not a triangle");
        }
    }
    public double getX1() {
        return x1;
    }
    public void setX1(double x1) {
        this.x1 = x1;
    }
    public double getX2() {
        return x2;
    }
    public void setX2(double x2) {
        this.x2 = x2;
    }
    public double getX3() {
        return x3;
    }
    public void setX3(double x3) {
        this.x3 = x3;
    }
    public double getY1() {
        return y1;
    }
    public void setY1(double y1) {
        this.y1 = y1;
    }
    public double getY2() {
        return y2;
    }
    public void setY2(double y2) {
        this.y2 = y2;
    }
    public double getY3() {
        return y3;
    }
    public void setY3(double y3) {
        this.y3 = y3;
    }

}


كالعادة يمكنك التعديل عليه كما تشاء
أو طرح أي أفكار لديك
إذا كان لديك فكرة عن طريقة أسهل لعمل أي دالة
فناقشها ليستفيد الجميع

تحياتي
shado
رائع ..
جائنا اليوم بالامتحان السي شوربا عفوا الشارب biggrin.gif
نفس هذا التكتيك ..عبارة عن خلق class لاحداثيي نقظة وكتابة التوابع الخاصة بها منRead ,Print,Set,Get,GetX,GetY
ومن ثم اشتقاق calss circle منها مستخدمين طبعا بالاضافة الى ذلك العناصر الخاصة بالـ Graphicse

لنرسم على ال Form يلي هوا من اختراع Microsoft (انا عارف من وين يجيبو هالاسامي) biggrin.gif
احدثيي نقطة ..ثم الدائرة التي تريد النقطة الثانية وهما الازمتين لرسم دائرة ...

اذا ما رائيك سيد علاء باستخدام مفهوم الورائة لفيد كل مبتدا ..بان نقوم مثلا بانشاء class احداثيي نقظة بclass point

كود
        public class TPoint
        {
            int x, y;
            public TPoint()
            {
                x = y = 1;
            }
            public TPoint(int x1, int y1)
            {
                x = x1;
                y = y1;
            }
            public TPoint(TPoint p)
            {
                x = p.x;
                y = p.y;
            }
            public void ReadPoint()
            {
                
            }
            public void PrintPoint()
            {
                
            }
            public void SetPoint(int x1, int y1)
            {
                x = x1;
                y = y1;
            }
            public int Getx()
            {
                return x;
            }
            public int Gety()
            {
                return y;
            }
            
        }


ونقوم بـclass Triangle بالـextends من class point
ونقوم بالــoverride لبعض الـmethod بالاضافة لانشاء احداث نقتطين فقط في ـclass Triangle


موضوع رائع ... فعلا يجب ان يكون مرجع لكل مبتدا برمجة ...

الله معك..
علاء الصالحي
لن نستفيد الكثير من وراثة النقطة في المثلث
لكن لنسهل الموضوع أكثر
سنستخدم الفئة نقطة التي قمت بعملها شادي
مع مفهوم الترابط composition
فيصبح عندنا بدل ست مدخلات
قد يتوه المبرمج في ترتيب الإحداثيات
ثلاث مدخلات
هل أقوم بعملها أم أن هناك من يريد التعلم؟

تحياتي
shado
نعم الهدف من فئة النقطة فعلا علاء ليس اكثر من تخفيف زحمة لا اكثر ولا اقل

لكن انا احببت ان انوه لان هذا الموضوع اكثر من رائع ليس ببساطته ..بل تقوم عليه او على مبادئه مشاريع كاملة في رسم
الاشكال الهندسية ...
لي عودة
الله معك..
علاء الصالحي
السلام عليكم
يبدو لي أنه لا أحد يريد أن يتعلم
على العموم هاقد قمت بالتعديل المطلوب
وأنا أعمل لاحظت مشكلة لدي
في عملية التقريب في دالة classify
كود
double A=Math.floor(Math.pow(lengths[0], 2)+.00005);

أتمنى أن يشاركوني المبتدئين في حلها cool.gif
هذه الفئة مثلث
كود
package triangle;

public class Triangle {
    private Point a;
    private Point b;
    private Point c;
    
    public Triangle(Point a,Point b,Point c){
        this.a=a;
        this.b=b;
        this.c=c;
    }
    public boolean isTriangler() {
        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;
        double[] lengths=lengths();
        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]=Math.sqrt(Math.pow(a.Getx()-b.Getx(), 2)+Math.pow(a.Gety()-b.Gety(), 2));
        lengths[1]=Math.sqrt(Math.pow(b.Getx()-c.Getx(), 2)+Math.pow(b.Gety()-c.Gety(), 2));
        lengths[2]=Math.sqrt(Math.pow(c.Getx()-a.Getx(), 2)+Math.pow(c.Gety()-a.Gety(), 2));        
        return lengths;

    }
    public String isScalene() {
        double lengths[]=lengths();
        if(lengths[0]!=lengths[1]&&lengths[1]!=lengths[2]&&lengths[0]!=lengths[2])
            return "scalene";
        else
            return "isosceles";
    }
    public String classify() {
        double lengths[]=lengths();
        double A=Math.floor(Math.pow(lengths[0], 2)+.00005);
        double B=Math.floor(Math.pow(lengths[1], 2)+.00005);
        double C=Math.floor(Math.pow(lengths[2], 2)+.00005);
        double D=Math.floor(Math.pow(lengths[1], 2)+Math.pow(lengths[2], 2)+.00005);
        double E=Math.floor(Math.pow(lengths[0], 2)+Math.pow(lengths[2], 2)+.00005);
        double F=Math.floor(Math.pow(lengths[1], 2)+Math.pow(lengths[0], 2)+.00005);
        System.out.println(A+"="+D);
        System.out.println(B+"="+E);
        System.out.println(C+"="+F);
        if(A==D||B==E||C==F)
            return "right";
        else if(Math.pow(lengths[0], 2)>Math.pow(lengths[1], 2)+Math.pow(lengths[2], 2)
                ||Math.pow(lengths[1], 2)>Math.pow(lengths[0], 2)+Math.pow(lengths[2], 2)
                ||Math.pow(lengths[2], 2)>Math.pow(lengths[1], 2)+Math.pow(lengths[0], 2))
            return "obtuse";
        else
            return "acute";
    }
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            double x1=Double.parseDouble(args[i]);
            i++;
            double y1=Double.parseDouble(args[i]);
            i++;
            double x2=Double.parseDouble(args[i]);
            i++;
            double y2=Double.parseDouble(args[i]);
            i++;
            double x3=Double.parseDouble(args[i]);
            i++;
            double y3=Double.parseDouble(args[i]);
            Triangle t=new Triangle(new Point(x1,y1),new Point(x2,y2),new Point(x3,y3));
            double[] lengths=t.lengths();
            for (int j = 0; j < lengths.length; j++) {
                System.out.println(lengths[j]+" ");
            }
            System.out.println();
            if(t.isTriangler()){
                StringBuilder s=new StringBuilder(" triangle");
                s.insert(0," " + t.classify());
                s.insert(0,t.isScalene());
                System.out.println(s.toString());
            }
            else
                System.out.println("not a triangle");
        }
    }
}

وهذه الفئة نقطة الخاصة بالأخ شادي عملت عليها تعديلات بسيطة
كود
package triangle;

public class Point
{
    private double x;
    private double y;
    public Point()
    {
        x = y = 1;
    }
    public Point(double x1, double y1)
    {
        x = x1;
        y = y1;
    }
    public Point(Point p)
    {
        x = p.x;
        y = p.y;
    }
    public void ReadPoint()
    {
        
    }
    public void PrintPoint()
    {
        
    }
    public void SetPoint(double x1, double y1)
    {
        x = x1;
        y = y1;
    }
    public double Getx()
    {
        return x;
    }
    public double Gety()
    {
        return y;
    }
    
}


تحياتي
Eisa Ayed
علاء المواضيع ان لم يحصل تفاعل مباشر
سياتي يوم من يبحث عنها .. فوق هذا 140 مشاهده ماذا تسميه cool.gif

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

تحياتي
azeez00
هذه مشاركتي بكود سي بلس .,, اسف جدا ان كان ممنوع وضع كود غير جافا .



CODE2






#include <iostream>
#include <math>
#include <conio>
using namespace std;

struct point
{
int x;
int y;
};

int main()
{


point A,B,C;

start:
cout<<"Enter A point:"<<endl;
cin>>A.x; cout.width(2); cin>>A.y;
cout<<"Enter B point:"<<endl;
cin>>B.x; cout.width(2); cin>>B.y;
cout<<"Enter C point:"<<endl;
cin>>C.x; cout.width(2); cin>>C.y; // A(x,y) B(x,y) C(x,y)



if(((A.x-B.x)==0 && (A.y-B.y)==0) || ((C.x-B.x)==0 && (C.y-B.y)==0) || ((A.x-C.x)==0 && (A.y-C.y)==0))
{cout<<"It's Not Triangle.."<<endl; goto start;}




int lengths[2];
lengths[0]=sqrt(pow((A.x)-(B.x),2)+pow((A.y)-(B.y),2)); // A----B
lengths[1]=sqrt(pow((A.x)-(C.x),2)+pow((A.y)-(C.y),2)); // A----C
lengths[2]=sqrt(pow((C.x)-(B.x),2)+pow((C.y)-(B.y),2)); // B----C




int fum=lengths[0]*lengths[1]*lengths[2];

if ((lengths[0]==lengths[1]||lengths[0]==lengths[1] || lengths[1]==lengths[2]))
cout<<"\t"<<"Isosceles Triangles";




if(fum==pow(lengths[0],3))
cout<<"\t"<<"Equilateral Triangle"<<endl;




if(pow(lengths[0],2)==pow(lengths[1],2)+pow(lengths[2],2)
||(lengths[1],2)==pow(lengths[0],2)+pow(lengths[2],2)
||(lengths[2],2)==pow(lengths[1],2)+pow(lengths[0],2))
cout<<"\t"<<"Right Triangle";



if(pow(lengths[0],2)>(pow(lengths[1],2)+pow(lengths[2],2)
||(lengths[1],2)>(pow(lengths[0],2)+pow(lengths[2],2)
||(lengths[2],2)>(pow(lengths[1],2)+pow(lengths[0],2)))))
cout<<"\t"<<"Obtuse Triangle";


else cout<<"\t"<<"Acute Triangle";


cout<<"\n\n"; cout<<"Segment[1]:"<<lengths[0]
<<"\t"
<<"Segment[2]:"<<lengths[1]
<<"\t"
<<"Segment[3]:"<<lengths[2]
<<"\t"
<<endl;

getch();
return 0;
}


































علاء الصالحي
بصراحة المنتدى للجافا
إن كنت تريد المساعدة بالنسبة للغة السي++
فتوجه إلى قسمها
أما إن كنت تريد أن تسأل شيء عن الموضوع
مثلاُ كيف تتأكد من أن الشكل مثلث
فاطرح اسألتك
وبإذن الله نجيبك

تحياتي
azeez00
كيفيه التعرف على المثلث هي : كما ذكرت اخ علاء , ولكني انا وضعت شرط بناء على متغيرات point x,y

كود
if(((A.x-B.x)==0 && (A.y-B.y)==0) || ((C.x-B.x)==0 && (C.y-B.y)==0) || ((A.x-C.x)==0 && (A.y-C.y)==0))


طيب ما رايك بهذا الكود للتعرف على المثلث ,, هل لديك لي مساعده ؟ او تنبيه ؟


ما رأيك بطريقه وضع المتغيرات في struct والتعامل معها لحل هذه المسألة ؟






azeez00
:::::::::::::::::::::::::: مشاركه بخصوص معرفة المثلث من أضلاعه ::::::::::::::::::::::::::::


هل المثلث متساوي الاضلاع ؟

ام هو متساوي الساقين فقط ؟

ام هواضلاعه تختلف قياسها عن الاخرى ؟


؟!؟!؟!؟!!؟!؟!؟! كـــــــــيف نحل هذه المسائل برمجيا ؟!؟!؟!؟!؟!!؟؟!؟


::::::::::::::::::::::::: حل لمتساوي الاضلاع ::::::::::::::::::::::::: :x*x*x = x^3 :::::::::::

اذا كانت الاضلاع متساويه فإن مجموع ضربها يساوي مجموع اي ضلع تكعيب .

كود
int fsum = L1*L2*L3;
if ( fsum=Math.pow(L1,3)
{
System.out.println("Equilateral Triangle");
}




::::::: طريقه موحده لحل جميع الانواع بإستخدام المصفوفات ::::::::::::::

بفضل ربي , وجدت ان هناك علاقه بين الاصناف الثلاث

وهي انن سوف اقوم بطرح العدد على جميع الاعداد ( العدد = طول الضلع) وانه في حال كان هناك ضلعان متساويان سوف يكون الناتج صفر ,

وسوف ادخل الارقام الناتجه من العمليه في مصفوفه خاصه فيهم , واعمل بحث في هذه المصفوفه عن عدد الاصفار .

في حال كان عدد الاصفار = 2 اصبح المثلث متساوي الساقين

في حال كان عدد الاصفار = 6 اصبح المثلث متساوي الاضلاع

وإلا فإن المثلث غير متساوي الاضلاع


كود
...      
int Line[2];
int LineInput[6];
int n(0);

Line[0]=Math.sqrt(pow((A.x)-(B.x),2)+Math.pow((A.y)-(B.y),2)); // A----B
Line[1]=Math.sqrt(pow((A.x)-(C.x),2)+Math.pow((A.y)-(C.y),2)); // A----C
Line[2]=Math.sqrt(pow((C.x)-(B.x),2)+Math.pow((C.y)-(B.y),2)); // B----C
      

//---------------------------------------

LineInput[0]=Line[0]-Line[1];    
LineInput[1]=Line[0]-Line[2];
LineInput[2]=Line[1]-Line[0];
LineInput[3]=Line[1]-Line[2];
LineInput[4]=Line[2]-Line[0];
LineInput[5]=Line[2]-Line[1];

//-----------------------------------------    

    for(int i=0; i<6; i++)
               {

                                  if(LineInput[i]==0)
            ++n;
           }

               if(n==6)
    
        System.out.println("Equilateral Triangle");

                         else if(n==2)  
    
                 System.out.println("Isosceles Triangles")
    
                                  else { System.out.println("scalene") }

}
علاء الصالحي
جميل أخي عزيز
سأنبهك إلى نقطة ربما لم تنتبه لها
المثلث يعتمد على قاعدة لا يمكن لأي ضلع أن يكون أكبر من الضلعين الآخرين
وعلى هذا يجب أن تفحص هذا المشكلة
لاحظ أنك في فحصك قصرت الفحص على هل النقاط نفس النقاط أم لا

على فكرة طريقتك في عملية الطرح
ثم المقارنة مع الصفر جميلة

تحياتي


azeez00
الله يبارك فيك اخوي علاء ... الحقيقة النقطة التي اثرتها مهمه جدا شكرا على التنبيه .

انا وضعت جزء من حل مشكله ... وان تحديد المعطيات هل هيا نقاط مثلث ام لاء فالحل اعتقد انك وضعته اخ علاء في مشاركاتك .

هل هناك تكمله لهذا الموضوع ام انه توقف ؟! لاني بدات انسى ماكنت بديت به regular_smile.gif

علاء الصالحي
هل لديك علمليات تقترحها علي
وسنقوم ببحثها
أنا أريد أن أفتح نقاش
لا أن أكون أنا من يكتب كل شيء

تحياتي
djug
إقتباس(alaadiaa @ Aug 7 2008, 12:42 AM) *
هل لديك علمليات تقترحها علي
وسنقوم ببحثها
أنا أريد أن أفتح نقاش
لا أن أكون أنا من يكتب كل شيء

تحياتي


016.gif

إليك ما يدور ببالي الآن

1/دالة تخبرنا إذا كانت نقطة نحددها لها تقع داخل المثلث أو لا

2/ إنشاء المثلث ليس فقط بالاعتماد على إحداثيات الرؤوس و إنما بطرق أخرى:
أ- تحديد ضلع(نقطتين) و زاوية
ب-تحديد رأس واحد + أطوال الأضلاع الثلاثة

نبدأ بعمل هذه الدوال ... و سنفكر في أخرى بعد الفراغ من هذه

ما رأيك ؟؟
علاء الصالحي
بداية جيدة أخ djug
طيب نبدأ في الأولى
مارأيك في أن نقوم بالتالي
لدينا معادلات الخط المستقيم لأي مثلث إذا حسبنا الميل والجزء المقطوع من محور الصادات
y=ax+b
حيث a ميل المستقيم
b الجزء المقطوع من ص
لو قمنا بتوصيل خط من كل رأس للمثلث إلى النقطة الجديدة
يجب أن لا يتقاطع أي ضلع من المثلث مع الخطوط الجديدة
وعلى هذا ستكون النقطة داخل المثلث
نقطة جيدة
لكن كيف يمكن أن نعرف هل الخط يتقاطع مع أحد الأضلاع
جاري التفكير
هل من أفكار حول الموضوع؟؟

تحياتي
djug
أعتقد أن هناك حلولا أفضل

نقارن إحادثيات النقطة المراد بحثها مع إحداثيات الرؤوس الثلاثة

أعتقد أنه توجد علاقة تجنبنا تعب التعمال مع معادلات المستقيمات أنا الآن أبحث فيها
djug
أخي علاء ما رأيك في الفكرة التالية لمعرفة إن كانت النقطة داخل المثلث:

نحسب معادلة المستقيم الخاصة بالمستقيم الحامل لكل ضلع

تكون النقطة داخل المثلث إذا و فقط إذا كانت:

*النقطة موجودة فوق ضلع واحد و أسفل ضلعين
* النقطة موجودة فوق ضلعين و أسفل ضلع واحد

كيف نعرف أن نقطة موجودة فوق مستقيم:
نضع إحداثيي النقطة في معادلة المستقيم و نحسب
إذاكانت النتجة سالبة فالنقطة فوق المستقيم و إذا كانت موجبة فهي تحت المتسقيم (و إذا كنت النتيجة 0 فإن النقطة تنتمي إلى المتسقيم regular_smile.gif )

ما رأيك ؟؟
علاء الصالحي
ماهو المستقيم الحامل للضلع؟

تحياتي
djug
إقتباس(alaadiaa @ Aug 8 2008, 09:34 PM) *
ماهو المستقيم الحامل للضلع؟

تحياتي


المستقيم الذي يمر على رأسي الضلع
(أي لو مددنا الضلع فسنحصل على هذا المستقيم)
علاء الصالحي
ماذا تعني أخ djug
عندما تقول
هذه النقطة أعلى من هذا الخط
في بعض الأحيان تكون النقطة على اليسار أو اليمين فكيف تقول أعلى
في بعض الأحيان يكون الضلع مائلاً فكيف نقول أعلى

تحياتي
djug
إقتباس(alaadiaa @ Aug 8 2008, 11:03 PM) *
ماذا تعني أخ djug
عندما تقول
هذه النقطة أعلى من هذا الخط
في بعض الأحيان تكون النقطة على اليسار أو اليمين فكيف تقول أعلى
في بعض الأحيان يكون الضلع مائلاً فكيف نقول أعلى

تحياتي


نقطة أ فوق المستقيم ∆:
لو رسمنا نصف مستقيم ابتداءا من هذه النقطة (أ)و يكون قاطعا و عموديا على محور السينات
فإنه يقطع بالضرورة المستقيم ∆

نقطة ب تحت المستقيم ∆:
لو رسمنا نصف مستقيم ابتداءا من هذه النقطة (ب)و يكون قاطعا و عموديا على محور السينات
فإنه لن يقطع أبدا المستقيم ∆

المستقيم الوحيد الذي لا يمكن أن تكون أية نقطة فوقه هو المستقيم الموازي لمحور الصادات

علاء الصالحي
جيد djug
ماذا عن حلك الآن
لو كان لدينا مثلث قائم الزاوية
فكيف يمكن أن نقول بأن نقطة ما داخله أو خارجه؟

لدي فكرة لكني لا أعلم كيف يمكن تطبيقها
مجموع الزوايا الناتجة عن توصيل نقطة داخل المثلث
مع رؤوس هذا المثلث تساوي 360 درجة
مجموع الزوايا الناتجة عن توصيل نقطة على ضلع واحد من أضلاع المثلث
مع رؤوس هذا المثلث تساوي 180 درجة
بينما لو كانت على ضلعين فهي أحد رؤوس المثلث
مجموع الزوايا الناتجة عن توصيل نقطة خارج المثلث
مع رؤوس هذا المثلث تساوي أقل من 180 درجة
لأنها تشكل زايا حادة دائماً

ما رأيك أخ djug؟
هل نستدعي أحد من قسم الرياضيات ليساعدنا؟

نقطة خارج الموضوع
على أي برنامج رسمت الرسمة السابقة؟

تحياتي
djug
* لا مشكلة مع المثلثات القائمة ماهي إلا حالة خاصة من المثلث العادي

* نعم يفضل استدعاء متخصصين من قسم الرياضيات لمساعدتنا (أهل مكة أدرى بشعابها) و نهتم نحن بالجزء المتعلق بالبرمجة

* البرنامج المستعمل لرسم الرسم السابق MS Word 2003 regular_smile.gif
azeez00

ما شاء الله ... مشاركات جميله وافكار اجمل ..

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

وانا سوف اقرا المشاركات بتمعن ودقه .. وسوف اطرح فكرتي بوضوح .. وان شاء الله نصل الى حل لهذه المشكله

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

أخوانى الافاضل بارك الله فيكم , وشكرا للاخوة الذين راسلونى للمشاركة فى هذا الموضوع المفيد ان شاء الله

ساتكلم ان شاء الله عن نقطتين مما اثيرا هنا وهما

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

طبعا انا مش هكتب اكواد , فانا ليس لى دراية بلغة الجافا للاسف. ولكن سأتكلم رياضيا , وانتم ترجموا لبرمجه regular_smile.gif

اولا: العلاقة بين اطوال اضلاع المثلث

بفرض ان اطوال اضلاع المثلث هى L1, L2, L3 سنقوم بحساب الفروق الاتية
كود
d1=L1-L2
d2=L2-L3
d3=L3-L1

وبحساب عدد الاصفار الناتجة يمكننا معرفة العلاقة بين الاضلاع الثلاثة على النحو التالى:
1) عدد الاصفار يساوى 0 اذا الاضلاع جميعها مختلفه.
2) عدد الاصفار يساوى 1 اذا هناك ضلعين فقط متساويين.
3) عدد الاصفار يساوى 3 جميع الاضلاع متساوية.

التوضيح:
1) لو الاضلاع كلها مختلفه , اذا لايوجد اصفار فى القيم السابقة وهذا واضح.
2) لو هناك ضلعين فقط متساويين , اذا سنحصل على صفر واحد من قيمة الفروق التى تجمعهما , وقيمتى الفروق الاخريين بالتاكيد ليستا اصفارا.
3) لو جميع الاضلاع متساوية , اذا جميع قيم الفروق السابقة اصفار وهذا واضح.

يتـــــــــبع ,,,
عماد حمدي احمد

ثانيا: العلاقة بين نقطة ومثلث

واضح طبعا ان العلاقة بين نقطة ومثلث هى احدى ثلاث حالات
1) النقطة داخل المثلث.
2) النقطة على المثلث.
3) النقطة خارج المثلث.

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

اى خط مستقيم معادلته Ax+By+C=0 , يقسم المستوى الى ثلاث مجموعات من النقاط كما بالشكل. مجازة (حسب الرسمة المرفقة) يمكن القول بانهم مجموعة النقاط يمين (او تحت) الخط S1 مجموعة النقاط على الخط S2 ومجموعة النقاط يسار (او اعلى) الخط S3

إضغط لإظهار المرفق


لكى نقول ان النقطتين p1 و p2 تقعان فى نفس الجهه من الخط المستقيم , فانه يجب عند التعويض بهما فى معادلة الخط كل على حده , فان اشارة المقدار الناتج منهما لابد وان تكون واحده. بمعنى لو بالتعويض بالنقطة p1 فى المعادلة Ax+By+C وكان الناتج موجبا , فانه لكلى تكون النقطة p2 معها فى نفس الجهه لهذا الخط المستقيم , يجب ان يكون قيمة التعويض بها فى الخط المستقيم ايضا موجبا.

وبالتالى اعتمادا على هذه النقطة. بفرض رؤوس المثلث هى p1, p2, p3 والنقطة محل الدراسة هى p فانه

1) النقطة تقع داخل المثلث اذا كان , برسم مستقيم مار بنقطتين من رؤوس المثلث ودراسة موقع النقطة محل الدراسة والرأس الثالثة وكانتا فى نفس الجهه بالنسبة لهذا المستقيم , وذلك يتحقق لجميع الاضلاع الثلاثة.

بمعنى اخر اذا كانت
النقطة p والنقطة p1 فى نفس الجهه للمستقيم المار بــ p2, p3 و
النقطة p والنقطة p2 فى نفس الجهه للمستقيم المار بــ p1, p3 و
النقطة p والنقطة p3 فى نفس الجهه للمستقيم المار بــ p2, p1

فان النقطة p تقع داخل المثلث.

2) اذا كان ناتج تعويض النقطة p مع اى مستقيم مار برأسين من رؤوس المثلث تساوى صفرا. وكانت تقع فى نفس الجهه مع الرأس الثالثة بالنسبة للمستقيمين الاخريين (شرط ضرور) , فان النقطة p تقع على المثلث.

3) ان لم يتحقق احد الحالتين السابقتين , اذا النقطة p خارج المثلث.

ملحوظه:

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

هى


بالله التوفيق ,,,
علاء الصالحي
شكراً جزيلاً أخ عماد
على مشاركتك الفعالة معنا

جيد جداً يا شباب
الآن لدينا الطريقة
من من المبتدئين معنا سيقوم بالبرمجة
كنت أريد برمجته
لكني رأيت أنه من الأنانية أن أقوم بذلك
فانتظار من سيقول أنا

تحياتي
djug
سأتولى ذلك إن شاء الله
سأبدأ أولى بالدوال المتعلقة بالمستقيم (نقطة فوق أو تحت و ما إلى ذلك)

ثم ننتقل إلى المثلث
azeez00
السلام عليكم

حل مسألة هل النقطه خارج ام داخل المثلث ؟ بإستثناء قائم الزاوية.


المرحلة الأولى :
1) نقوم باخراج اكبر واصغر قيمه لمحور الصادات لنقاط المثلث.
2) نقوم بإخراج اكبر واصغر قيمة لمحور السينات لنقاط المثلث.

تعريف :: (Max_x) (Max_y) (Min_x) (Min_y)




المرحلة الثانية : " تقليص المساحة "

الخطوة الأولى:
1) نقوم بمقارنه احداثية المحور الصادي : هل الاحداثية للمحور الصادي الذي تم استلامها اكبر من القيمة الكبرى للمحور ام اصغر.
2) ان كانت اكبرمن القيمة الكبرى فهيا خارج المثلث , ان كانت اصغر من القيمة الصغرى فهيا خارج المثلث .

الخطوة الثانية:
3) نقوم بمقارنه احداثية المحور السيني : هل الاحداثية للمحور السيني الذي تم استلامها اكبر من القيمة الكبرى للمحور ام اصغر
4) ان كانت اكبر من القيمة الكبرى فهيا خارج المثلث , ان كانت اصغر من القيمة الصغرى فهي خارج المثلث .


المرحلة الثالثة :


الخطوة الأولى : " دالة القاطع "

1) تحديد قيم المحور السيني " اكبر , وسط , اصغر " Max_x) (Med_x) (Min_x)
2) نزيد اكبر قيمة من المحور واحد بحيث نكون نقطة جديدة تساوي ((Max_x)+1,y)
3) نخرج مستقيم يمر من النقطة ((Max_x)+1,y) الى النقطة ((Med_x),y)
4) دالة المستقيم F_xmaxTO_xmed(x)



الخطوة الثانية : " تحديد النقطة الرئيسية "

1) تحديد نقطة تتجه اليها جميع النقاط داخل المساحة المحصوره " انظر الى الرسم " , "راجع المرحلة الثانية " .
2) النقطة = (Max_x),F_xmaxTO_xmed(x)))

المرحلة الرابعة :

النقطة الهدف = (a,b)

الخطوة الأولى : " تحديد المسافات "

1) اوجد المسافة بين (a,b) و Max_x),F_xmaxTO_xmed(x)))
2) اوجد المسافة بين نقطة التقاطع (intersect(f_a(x),b) فان لم تجد احفظ القيمة "قيمة تميزه"
3) اوجد المسافة بين نقطة التقاطع intersect(f_b(x),b)
4)) اوجد المسافة بين نقطة التقاطع (intersect(f_c(x),b)


الخطوة الثانية : " تحديد الموقع للنقطة الهدف "

1) intersect(f_a(x),b)) " خطأ":

2) في حال كانت المسافة "1" اكبر من "3" و "4" ’ النقطة (a,b) خارج المثلث.
2) في حال كانت المسافة "1" اصغر من "3" و "4" ’ النقطة (a,b) خارج المثلث.
3) في حال كانت المسافة "1" تساوي احدى المسافات التالية "3" او "4" ’ النقطة (a,b) مماس للمثلث .
4) والا ... فان النقطة (a,b) داخل المثلث .

1) (intersect(f_a(x),b)) "صواب":


1) في حال كانت المسافة "1" اكبر من "2" و "4" ’ النقطة (a,b) خارج المثلث.
2) في حال كانت المسافة "1" اصغر من "2" و "4" ’ النقطة (a,b) خارج المثلث.
3) في حال كانت المسافة "1" تساوي احدى المسافات التالية "2" او "3" او "4" ’ النقطة (a,b) مماس للمثلث .
4) والا ... فان النقطة (a,b) داخل المثلث .



تحياتي للجميع ..
azeez00
اخواني المبرمجين او كل من لديه معرفه في الرياضيات نحتاج مشاركاتكم ,. ولو بسطر واحد



ربما تقترح علي كود او خوارزمية حل اسرع وابسط من الذي اكتبه انا ,, كما فعل الاخ الفاضل عماد حمدي في معرفة متساوي الاضلاع.


ثانيا المثلثات من وجهة نظري امرها ليس بتلك السهوله والعمليات التي سوف تكون عليها متنوعه وكل عمل يتعامل مع نوع معين من المثلث , هذا من جانب ..

ومن جانب اخر , لابد يكون هناك ايضا عمليات لمعرفة نوع المثلث , لكي يكون هناك توافق بين جميع الحلول.


في المرفقات صوره لقائم الزاوية في جميع حالاته .. ارجوا المساعده
عماد حمدي احمد
السلام عليكم ورحمة الله

اخى الفاضل azeez00

للاسف انا مش قادر افهم المشاركتين الاخيرتين لك , لكن سابسط ما جاء فى مشاركتى السابقة.

بفرض رءوس المثلث هى (x1,y1), (x2,y2), (x3,y3) وان النقطة محل الاختبار هى (a,b )

لمعرفة ما اذا كانت النقطة داخل او على او خارج المثلث سنقوم بعمل الاتى: نحسب القيم التالية

كود

c1= [(y2-y1)*(a-x1)-(x2-x1)*(b-y1)] * [(y2-y1)*(x3-x1)-(x2-x1)*(y3-y1)]
c2= [(y3-y1)*(a-x1)-(x3-x1)*(b-y1)] * [(y3-y1)*(x2-x1)-(x3-x1)*(y2-y1)]
c3= [(y3-y2)*(a-x2)-(x3-x2)*(b-y2)] * [(y3-y2)*(x1-x2)-(x3-x2)*(y1-y2)]

ومنها يمكن استنتاج التالى:

1) اذا كانت جميع القيم السايقة موجبة , فان النقطة تقع داخل المثلث.
2) اذا كانت احد القيم سالبة , فالنقطة خارج المثلث.
3)اذا كانت احد القيم صفرا , وباقى القيم موجبة , فالنقطة على المثلث.

=================
التوضيح:

كما قلنا سابقا , فان معادلة المستقيم المار بالنقطتين (x1,y1), (x2,y2) هى
كود
(y2-y1)*(x-x1)-(x2-x1)*(y-y1)=0

وبالتالى لمعرفة ما اذا كانت النقتطين (x3,y3) و (a,b ) تقعان فى نفس الجهه ام لا؟ سنقوم مرة بالتعويض بالنقطة (a,b ) ومرة بالنقطة (x3,y3) فى الطرف الايسر للمعادلة السابقة. واذا كانت النتائج تحمل نفس الاشارة فهما فى نفس الجهه , واذا كانت الاشارات مختلفه فهما فى جهتين مختلفتين. وبالطبع لمعرفة تساوى الاشارتين او اختلافهما , سنقوم بضرب الناتجين فى بعضهما , فلو الناتج النهائى موجب هذا يعنى تساوى الاشارتين , ولو الناتج سالب فهذا يعنى اختلاف الاشارتين.

وبالطبع نفس الكلام مع باقى النقاط.
=================

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


djug
محاولة أولى
ملاحظة:
1/ الكود مكتوب بطريقة ينقصها بعض النظام
2/ إمكانة وجود أخطاء جد واردة


أولا لدينا class خاص بالمستقيمات

كود
public class droite {
    public float a;
    public float b;
    public float c;
// معادلة من الشكل
// ax+by+c=0


// ميل المستقيم
    public float ponte;


// Constructor

//إنشاء مستقيم بدون أية معطيات
    public droite()
    {
        a=b=c=ponte=0;
        
    }

// إنشاء مستقيم بإدخال المعطيات الثلاثة
    public droite(float A,float B, float C)
    {
        a=A;
        b=B;
        c=C;
        if (b!=0)  ponte= -a/b; else ponte=Float.MAX_VALUE;
        
    }

//  إنشاء مستقيم  بدلالة نقطتين
    public  droite(float x1,float y1,float x2,float y2)
    {
        float A= (y2-y1)/(x2-x1);
        float B=y1-A*x1;
        a=A;
        b=-1;
        c=B;
        if (b!=0)  ponte= -a/b; else ponte=Float.MAX_VALUE;

    }

// معرفة مكان نقطة بالمقارنة بمستقيم
// 1 : فوق
// -1: تحت
// 0: تنتمي إلى المستقيم
    public  int position(float x,float y)
    {
        
        
        float reslut = (a*x+b*y+c);

        
        if (reslut*ponte==Float.MAX_VALUE) return -1;
        if(ponte==0){
            if (y>0) return 1;
            if (y<0) return -1;
            return 0;
        }
            
        if(ponte>0)
        {
        if (reslut*ponte<0) return 1;// audessus
        if (reslut*ponte>0) return -1;// audesous
        }
        else
        {
            if (reslut*ponte>0) return 1;// audessus
            if (reslut*ponte<0) return -1;// audesous
        }
    
    

        return 0;//  sur
        
        
    }

}
djug
و الآن معرفة ما إذا كانت نقطة داخل مثلث أو خارجه

كود
    public boolean pointIn(float x,float y)
     {
//ننشئ ثلاث مستقيمات  الخاصة بالمثلث
         droite drt1 = new droite(x1,y1,x2,y2);
         droite drt2 = new droite(x1,y1,x3,y3);
         droite drt3 = new droite(x2,y2,x3,y3);
        
        
         if((drt1.position(x, y)==1)&&((drt2.position(x, y)==1))&&((drt3.position(x, y)==1))) return false;
         if((drt1.position(x, y)!=1)&&((drt2.position(x, y)!=1))&&((drt3.position(x, y)!=1))) return false;
        
         return true;
     }


لدينا 8 حالات ممكنة للمستقيم (0 تحت(أو ينتمي إلى المستقيم ) و 1 فوق )

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

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

أي نبحث إن كانت إحدى هاتين الحالتين محققة (أفضل من بحث العكس) للجزم أن النقطة خارج المثلث
djug
هل هناك من جرب (أو على الأقل قرأ الـ class التي كتبتها)

و هل من تعليقات/ أخطاء/ إضافات ؟؟
علاء الصالحي
أخ djug
عندي لبس في شيفرتك
لماذا استخدمت الميل slope أو بالفرنسية ponte ؟
الأخ عماد لم يتطرق لذلك إطلاقاً
بعد ذلك عندما تضرب القيمة العليا للمتحول Float في أي شيء
فلن تحصل على القيمة العليا
فهي لا تمثل المالانهاية
كود
if (reslut*ponte==Float.MAX_VALUE) return -1;

وإنما سيحصل لدينا overflow وستجد أن الناتج أصبح بالسالب
هل هناك خطأ في فهمي
أرجو التوضيح

تحياتي
djug
إقتباس(alaadiaa @ Aug 15 2008, 01:24 PM) *
أخ djug
عندي لبس في شيفرتك
لماذا استخدمت الميل slope أو بالفرنسية ponte ؟
الأخ عماد لم يتطرق لذلك إطلاقاً


استعملت طريقة مغايرة -لكن أظن أن يجب الرجوع إلى طريقته-
سأحاول مجددا إن شاء الله

إقتباس
بعد ذلك عندما تضرب القيمة العليا للمتحول Float في أي شيء
فلن تحصل على القيمة العليا
فهي لا تمثل المالانهاية
كود
if (reslut*ponte==Float.MAX_VALUE) return -1;

وإنما سيحصل لدينا overflow وستجد أن الناتج أصبح بالسالب
هل هناك خطأ في فهمي


هذه الحالة لما يكون المستقيم موازيا لمحور الصادات
أي أن الميل هو ∞ و يكون حاصل الضرب أيضا ∞
جرب
system.out.println(Float.MAX_VALUE))
تعطيك النتيجة Infinity

على كل حال... سأعيد كتالة الكود بناء على توصيات الأخ عماد حمدي احمد
علاء الصالحي
هذا المتغير
يحتوي على أكبر قيمة يمكن أن يحتويها المتغير من نوع Float
صحيح كبيرة جداً
لكن هذا لا يعني أنك في حالة ضربه بعدد سيعطيك مالانهاية

تحياتي
azeez00

اولا ااسف على التاخير في الرد ,, لانشغالي بضيوف اتوني من بلد عربي عزيز علينا كلنا .. وما فرغت الا الليله ..


شكرا جزيلا ,, للاخ الاستاذ عماد حمدي على مشاركته معنا ..

الحقيقة دائما تكون حلوله دقيقة وواضحه وتمتاز بالبساطه وعدم التعقيد , وهذا لا يعني ان الحلول التي وضعت خطا , مع ان الحل الذي وضعته اجزم بانه حل صحيح ولكنه معقد جدا ويحتاج الى اكواد كثيره . وهذه ميزه اتمنى ان اتجنبها في حياتي المستقبليه .


انا لم اطبق الحل الى الان .. ولكن سؤالي هل هو صالح في جميع حالات المثلث , طبعا السؤال هذا سوف يجيب عليه اما الكود الذي سوف اجرب عليه ,, او الاخ عماد حمدي ..

وشكرا للاخ علاء وشكرا للاخ djug

azeez00
هذا هو الكود وفعلا اجاب الكود عن سؤالي ,, وهو يعمل بالشكل المطلوب ,, شكرا جزيلا على هذه المشاركه اخ عماد .

كود
class WhereIsPoint {

private:
int c1,c2,c3;

public:
WhereIsPoint();

int Method_a(int,int,int,int,int,int,int,int);
int Method_b(int,int,int,int,int,int,int,int);
int Method_c(int,int,int,int,int,int,int,int);

}; //end class

WhereIsPoint::WhereIsPoint()
{
c1=0; c2=0; c3=0;
}
int WhereIsPoint::Method_a(int y1,int y2,int y3, int x1, int x2,int x3,int a,int b)
{
c1= ((y2-y1)*(a-x1)-(x2-x1)*(b-y1)) * ((y2-y1)*(x3-x1)-(x2-x1)*(y3-y1));

return c1;
}
int WhereIsPoint::Method_b(int y1,int y2,int y3, int x1, int x2,int x3,int a,int b)
{
c2= ((y3-y1)*(a-x1)-(x3-x1)*(b-y1)) * ((y3-y1)*(x2-x1)-(x3-x1)*(y2-y1));

return c2;
}

int WhereIsPoint::Method_c(int y1,int y2,int y3, int x1, int x2,int x3,int a,int b)
{
c3= ((y3-y2)*(a-x2)-(x3-x2)*(b-y2)) * ((y3-y2)*(x1-x2)-(x3-x2)*(y1-y2));
return c3;
}

int main()
{
  WhereIsPoint one;
int y1,y2,y3;
int x1,x2,x3;
int a,b;

System.in.println("enter the first point");
  x1=System.in.readInt();
  y1=System.in.readInt();
  
System.in.println("enter the second point");
  x2=System.in.readInt();
  y2=System.in.readInt();
  
System.in.println("enter the third point");
  x3=System.in.readInt();
  y3=System.in.readInt();
  
  System.in.println("enter the Target point");
  a=System.in.readInt();
  b=System.in.readInt();


/* now  */


if(one.Method_a(y1,y2,y3,x1,x2,x3,a,b)>0 && one.Method_b(y1,y2,y3,x1,x2,x3,a,b)>0&& one.Method_c(y1,y2,y3,x1,x2,x3,a,b)>0)
System.out.println(" Point is inside");
else if(one.Method_a(y1,y2,y3,x1,x2,x3,a,b)<0||one.Method_b(y1,y2,y3,x1,x2,x3,a,b)<0||one.Method_c(y1,y2,y3,x1,x2,x3,a,b)<0)
System.out.println(" Point is outside");
else
System.out.println(" Point is Tangent");

    
  return 0;
}
علاء الصالحي
أخ عزيز هذا منتدى جافا وليس C++
على العموم سعيدين بتواجدك معنا

أخ djug هل من جديد معك؟

تحياتي
djug
ترجمة ما كتبه الأخ عماد حمدي احمد في المشاركة رقم 32 إلى الجافا

كود
public int pointPosition(float a , float b)
      {
  
  //in:1
  //on:0
  //out:-1
      float c1,c2,c3;
      
      c1 = ((y2-y1)*(a-x1)-(x2-x1)*(b-y1)) * ((y2-y1)*(x3-x1)-(x2-x1)*(y3-y1));
      c2= ((y3-y1)*(a-x1)-(x3-x1)*(b-y1)) * ((y3-y1)*(x2-x1)-(x3-x1)*(y2-y1));
      c3= ((y3-y2)*(a-x2)-(x3-x2)*(b-y2)) * ((y3-y2)*(x1-x2)-(x3-x2)*(y1-y2));
      
      if((c1>0)&&(c2>0)&&(c3>0)) return 1;
      if((c1<0)||(c2<0)||(c3<0)) return -1;
      return 0;
      }
azeez00
ههههههه اخ علاء ..

والله الموضوع جذاب ويستحق المشاركه .. والموضوع بشكل عام لا يتعلق بلغات برمجه ,, وانما يتعلق بالخوارزميات .

لكن على العموم شكرا جزيلا ...


الان بما اننا وبفضل الله سبحانه استطعنا الاجابه عن الاسئلة المذكورة ..


الان من يجد لنا حل التالي :


ما هي الطريقة لمعرفة انواع المثلث ؟
azeez00
Right Triangle : قائم الزاوية




Acute Triangles : مثلث ذو زاوية حادة



Obtuse Triangles : مثلث ذو زاوية منفرجة




مشاركة الاخ عماد حمدي :

d1=L1-L2
d2=L2-L3
d3=L3-L1
وبحساب عدد الاصفار الناتجة يمكننا معرفة العلاقة بين الاضلاع الثلاثة على النحو التالى:
1) عدد الاصفار يساوى 0 اذا الاضلاع جميعها مختلفه.
2) عدد الاصفار يساوى 1 اذا هناك ضلعين فقط متساويين.
3) عدد الاصفار يساوى 3 جميع الاضلاع متساوية.


Equilateral Triangles : مثلث متساوي الأضلاع




Isosceles Triangles : مثلث متساوي الساقين




Scalene Triangles : مثلث ذو الاضلاع المختلفة





djug
أخي عزيز

لقد قام الأخ علاء بالتطرق لمعرفة نوع المثلث في المشاركة الأولى ( إلا إذا رأى الأخ علاء ضرورة إعادة صياغتها وفق طريقة الأخ عماد حمدي احمد)


هل هناك أفكار أخرى ؟؟
azeez00
سبحان الله ,, مع اني وضعت مشاركة الاخ علاء ؟؟! لكن لماذا لم تظهر ؟

وكانت بهذا التنسيق :

مشاركة الاخ علاء :

يكون المثلث منفرج
إذا كان مربع أحد الأضلاع أكبر من مبربعي الضلعين الآخرين
يكون المثلث قائم (نظرية فيثاغورث)
إذا كان مربع أحد الأضلاع يساوي مربعي الضلعين الآخرين
ويكون حاد إذا لم يتوفر أحد الشرطين السابقين



azeez00
طيب ما فائد كل هذا النقاش ان لم يكن هناك ما يلخص العمل في كود برمجي JAVA ?

اقصد ما رايكم بهذا الكلاس :



كود
class Triangle {

// fields
private float x1;
private float x2;
private float x3;
private float y1;
private float y2;
private float y3;

// methods
public void A(float valx,float valy);
public void B(float valx,float valy);
public void C(float valx,float valy);
public boolean  IsTriangler();
public int pointPosition(float a,float b);
        // type_name hisType(*V);  
        }


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

ثانيا انا عندي اقتراح لك اخي djug لماذا جلعت دالة pointPosition قيمة راجعة اليس من الافضل ان تكون هي من تعبر عن ذالك بواسطة جمل الشرط وكود جملة الاخراج .

اتمنى ان يكون النقاش التالي حول دالة تحديد نوع المثلث وطريقة هندسة الكود .

تحياتي
علاء الصالحي
لا أعرف ما المشكلة أخ عزيز
ما المشكلة التي تراها هاهنا؟؟؟

أنا أؤيد جعل الدالة pointPosition ترجع قيمة
لأنه تعطي المبرمج حرية الاستفادة من المعلومة التي حصل عليها

تحياتي
azeez00
انا جعلت الدالة تستوفي غرض واحد ,, ولكن الاخ djug نظر الى اغراض عدة وهذه ميزة سوف تكون عندي مستقبلا .
علاء الصالحي
ما رأيكم بأن نقوم بعمل إعادة تصنيع re factoring
لما قمنا به حتى الآن
هل من تصورات لديكم حول الموضوع
سنقسم ما قمنا به على ثلاث فئات
الفئة الأولى نقطة
الفئة الثانية خط
الفئة الثالثة مثلث

الفئة الأولى نقطة
النقطة تحتوي على الإحداثي السيني x والإحداثي الصادي y
نلاحظ أن هذه الإحداثيات لا تتغير مع الزمن
لهذا سنزيل الدوال Sety و Setx
وسنجعل المتغيرات x,y تأخذ قيمها من البناء constructor

الفئة الثانية خط
ستأخذ نقطتين في صانع كائناتها
لن تأخذ A,B,C
كما فعل الأخ djug
لأننا نتكلم عن القطعة المستقيمة
والقطعة المستقيمة محدودة بنقطتين
أما المستقيم فمفتوح إلى ما نهاية من الطرفين
ستحتوي على الدالة طول
هل من اقتراحات أخرى؟؟

الفئة الثالثة المثلث
تحتوي على الدوال التي قمنا بعملها
مع إعادة الهيكلة لتوائم مع الفئات السابقة

هل هناك أي اعتراضات على ما ذكرت؟
هل أقوم بذلك؟أم هناك من يريد القيام بها؟

بعد أن ننتهي سنبحث في أمور أخرى بإذن الله

تحياتي
هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2008 Invision Power Services, Inc.