PDA

View Full Version : سوال: كشيدن خط با php



ravand
پنج شنبه 29 دی 1390, 14:51 عصر
سلام
من به تازگي خيلي به مبحث GD كه يه بحثي در مورد گرافيك در php هست علاقمند شدم. خيلي بحث جالبي هست. اولا فكر ميكردم فقط مربوط به تصوير امنيتي هست . حالا فهميدم فراتر از اين حرف هاست.
دنبال اين هستم تا بتونم كدي بنويسم كه با كشيدن ماوس در صفحه يك خطي كشيده بشه. هر چي گشتم چيزي گيرم نيومد. فقط كد زير كه با كشيدن ماوش مختصات ماوس رو نشون ميده ولي من ميخوام خط كشيده بشه. مثل اين سايت:
http://zwibbler.com/

كدهايي كه براي مختصات پيدا كردم اينه:



<form method="post" action="">
<input type="image" src="8.php" name="img" />
</form>
<pre>
<?php
print_r($_POST);
?>
</pre>


<?php
header('Content-Type: image/png');
$image = imagecreatetruecolor(300, 200);
$color = imagecolorallocate($image, 255, 255, 255);
imageline($image, 0, 0, 20, 10, $color);
imagepng($image);
imagedestroy($image);
?>
منبع : http://forums.devnetwork.net/viewtopic.php?f=6&t=123315

فكر ميكنم بايد از جي كوئري يا جاوا اسكريپت كمك بگيرم. نظر شما چيه؟

djsaeedkhan
پنج شنبه 29 دی 1390, 15:03 عصر
سلام
این سایتی که فرمودید از کجاش مشخصه با php هست. چون توابع داخل Php مقدار میگیرن و بعد نمایش داده میشن. یعنی باید کمپایل بشن و بعد نمایش داده بشن. اینطور نیست که همش در حال اجرا باشن و هر لحظه بشه تغییرشون داد.
ولی شاااااید بشه با تلفیقی از php و مثلا(شاید)جاوا اسکریپت و اجاکس همچین کاری کرد.

djsaeedkhan
پنج شنبه 29 دی 1390, 15:12 عصر
یه کاری هم میشه کرد
مثلا کاربر برای کشیدن خط یه کلیک میکنه (به عنوان مختصات شروع) و یه کلیک کی کنه واسه مختصات پایان و عکس ترسیم میشه

H:Shojaei
پنج شنبه 29 دی 1390, 15:17 عصر
یه کاری هم میشه کرد
مثلا کاربر برای کشیدن خط یه کلیک میکنه (به عنوان مختصات شروع) و یه کلیک کی کنه واسه مختصات پایان و عکس ترسیم میشه

سلام
پس انحناهایی که بعد از هر کلیک میدن چی؟

ravand
پنج شنبه 29 دی 1390, 16:21 عصر
سلام
این سایتی که فرمودید از کجاش مشخصه با php هست. .

من كه نگفتم اين سايت با php ساخته شده من ميخواستم بگم كه ميخوام مثل اين سايت يه چيزي بسازم كه خط بكشه همين :لبخند:

djsaeedkhan
پنج شنبه 29 دی 1390, 16:58 عصر
با سلام دوباره
این که شما میبینی اون مختصات رو (تو کد های اولین پست) نشون میده به خاطر خاصیت Image در فرم هست. شما اگر به جای متد post بذاری get میبینی همین مختصات در یو آز ال قرار میگیره.
خودمم هم روز فکر کردم و دیدم میشه همچین چیزی رو بصورت ساده و بدون جاوا و ... درست کرد.
کاری که باید کرد اینه که یه کلید میذاری واسه رسم مربع. کاربر روی مختصات عکس کلیک میکنه. اولین کلیک مختصات اول و دومین کلیک متخصات مقصد و این یه خط از این جا به اون جا رسم می کنی و تمام. البته باید مختصات رو توی سشنی ذخیره کنی که بعدا بهش دسترسی داشته باشی. مثلا یه آرایه تو سشن باشه که وقتی رسم تموم شد سشن رو خالی کنه و عکس هم فیکس بشه

ایشالا امتحان شنبه بگذره همین رو برات پیاده سازی می کنم

ravand
پنج شنبه 29 دی 1390, 17:45 عصر
حق با شماست . من بهش GET دادم اين شكلي شد:

http://localhost/test.php?img.x=104&img.y=100
الان ما توي اين خط مقدار مختصات رو قرار داديم : 0, 0, 20, 10

imageline($image, 0, 0, 20, 10, $color);
اگه مقداري كه ارسال ميشه به جاي اينا با كد زير كه داخل متغيير قرار ميگيره قرار بديم فكر ميكنم مشكل حل شه.

$x=$_POST[img.x];
حالا مثلا متغيير $x رو جايگزين يكي از اعداد كنيم و بقيه رو هم به همين شكل.
ولي مشكل اينجاست كه ما چهار تا عدد داريم و دو تا گزينه ي img.x و img.y
حالا بايد چيكار كرد؟

djsaeedkhan
پنج شنبه 29 دی 1390, 18:20 عصر
سلام
خط یه مختصات مبدا داره و یه مختصات مقصد
کاری که باید کرد اینه که یک جوری مقدار قبلی رو هم نگه داری کرد. حالا یا با فیلد هیدن باشه یا سشن باشه یا ....
مثلا یه فیلد هیدن میگیرید که نشون بده این دفعه اول هست که کلیک می کنه یا دفعه دوم.
یه فیلد هیدن که مختصات کلیک شده قبلی رو در خودش ذخیره کنه و به صفحه بعد بفرسته

داری وسوسه ام می کنی اینو بشینم درستش کنم ها

ravand
پنج شنبه 29 دی 1390, 18:40 عصر
پس دو تا مقدار بايد بهش بديم مقدار اول كه براي اول خط هست مثل x,y و مقداري كه آخر خط هست مثل x1,y1 .

djsaeedkhan
پنج شنبه 29 دی 1390, 18:56 عصر
یه کار دیگه هم میشه کرد
وقتی کاربر روی عکس کلیک کرد با جاوا اسکریپت مختصات شروع
و وقتی رها کرد مختصات پایان رو پیدا کرد

و وقتی که رها کرد این دو مختصات ارسال بشه و تصویر کشیده بشه
http://www.breakingpar.com/bkp/home.nsf/0/87256B14007C5C6A87256B4B0005BFA6

http://docs.jquery.com/Tutorials:Mouse_Position

http://www.codelifter.com/main/javascript/capturemouseposition1.html

فقط باید کاری کنی که مختصات وقتی روی عکس هست ارسال بشه
نه وقتی وسط صفحه کلیک کرد مختصات ارسال بشه. مگر اینکه عکست تمام صفحه باشه

ravand
پنج شنبه 29 دی 1390, 19:06 عصر
الان اين خط چهار تا عدد از ما ميخواد در صورتي كه ما دو تا عدد با اين كد ها بدست مياريم.
ما الان ميخوايم عددي كه بدست مياريم جايگزين اين اعداد بشه .

imageline($image, 0, 0, 20, 10, $color);
حالا بايد چيكار كرد؟

ravand
پنج شنبه 29 دی 1390, 19:14 عصر
فكر ميكنم مجبور بشيم مقدار اول كه مال شروع خط هست رو به ديتابيس ارسال كنيم بعد مقدار بعدي هم كه مال آخر خط هست رو به ديتابيس بفرستيم و بعد از ديتابيس فراخوانيش كنيم و با اين خط چاپش كنيم.

imageline($image, 0, 0, 20, 10, $color);
يا شايدم نياز بشه از html5 استفاده كنيم چون html5 يه بانك اطلاعاتي داره كه در خود مرورگر ذخيره ميشه.
نظر شما چيه؟ :متفکر:
من تا راه حل اين مسئله رو نفهمم امشب خوابم نميبره :لبخند:

djsaeedkhan
پنج شنبه 29 دی 1390, 22:59 عصر
سلام
این هم از این
خیلی حال داد
اینم کشیدن خط با دوتا کلیک (روی عکس کلیک اول مختصات اول کلیک دوم نقطه پایان)
فقط این فعلا دارویه خواب شما
بعدا میشه همه کاری روش انجام داد (حتی با یه کلیک)
گفتم منو وسوسه نکنیدا

H:Shojaei
پنج شنبه 29 دی 1390, 23:28 عصر
سلام
این هم از این
خیلی حال داد
اینم کشیدن خط با دوتا کلیک (روی عکس کلیک اول مختصات اول کلیک دوم نقطه پایان)
فقط این فعلا دارویه خواب شما
بعدا میشه همه کاری روش انجام داد (حتی با یه کلیک)
گفتم منو وسوسه نکنیدا
سلام
کار نمیکنه

H:Shojaei
پنج شنبه 29 دی 1390, 23:32 عصر
درست شد
با php هم میشه یه قسمتش با java نوشتی

H:Shojaei
پنج شنبه 29 دی 1390, 23:39 عصر
سلام آقا شما بگو تابع mouseup (وقتی کلیک تمام شد) تو java چیه من باقیش رو بنویسم

djsaeedkhan
پنج شنبه 29 دی 1390, 23:44 عصر
داخل فایل form به جای کلمه click باید یکسری تغییرات داد. مثلا وقتی mousedown شد مختصات اول و mouseup شد مختصات دوم.
در گوگل یافت می شود. همش را آنجا جسته ایم

djsaeedkhan
جمعه 30 دی 1390, 13:57 عصر
دوستان عزیز اگر بتونید یه کاری کنید عالی میشه
بعد از ایجاد هر تصویر اون رو با تصویر قبلی (فایل عکس png) ذخیره کنید.
وقتی کاربر کلید جدید رو زد تصویر رو حذف و یک عکس خالی جایگزین بشه
و وقتی کاربر روی تصویر خط میشه خط های قبلی هم بمونن.

ravand
جمعه 30 دی 1390, 14:05 عصر
فكر نميكردم php اينقدر محدوديت داشته باشه . الان به خاطر محدوديتش هست كه ما داريم اينقدر اعصاب خودمون رو خورد ميكنيم.
اين كد متعلق به ويژوال بيسيك هست:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line -(X, Y)
End Sub
باورت نميشه به راحتي ميشه باهاش خط كشيد.
من فكر ميكنم ما اين كد php رو هم مي تونيم بهتر بنويسيم.
من وقتي با حلقه در ويژوال كدي مي نوشتم هر بار كه عددي رو وارد تكست ميكردم عدد قبلي رو در خودش داشت بعد كه محدوده ي اعدادي كه تعيين كرده بودم تموم ميشد خودش اين اعدادي كه وارد كردم رو حساب ميكرد. يعني يه كار ميكردم كه مثلا سه تا عدد وارد مي كردم و وقتي هر سه وارد شد حالا هر سه عدد رو چاپ ميكرد . اگه با php هم بهش اين كار رو كرد خيلي خوبه.

MMSHFE
جمعه 30 دی 1390, 14:51 عصر
دوست عزیز، لطفاً PHP رو با زبانهای دسکتاپ مثل VB مقایسه نکنید. PHP تحت وب هست و ضمناً سمت سرور کار میکنه. درحال که رویدادهای کلیک کردن و... سمت کلاینت هست. طبیعی هست که در زبانهایی مثل VB و ++C و #C و کلاً زبانهای دسکتاپ به راحتی با رویدادهای ماوس و... بشه کار کرد چون رویدادها روی همون سیستمی تولید میشه که کدهای پردازشی قرار داره اما در وب اینطور نیست. کاربر روی کامپیوتر خودش کلیک میکنه و کدهای PHP روی کامپیوتر سرور هست که هرجای دنیا میتونه قرار داشته باشه. باید این وسط یک رابط برای انتقال اطلاعات دریافت شده از کلاینت به سرور و پردازش اونها و دریافت خروجی پردازشها و نمایش مجدد در کلاینت بکار ببریم که میشه همون AJAX
لطفاً موقع مقایسه کردن دقت بیشتری کنید. موفق باشید.

djsaeedkhan
جمعه 30 دی 1390, 15:59 عصر
سلام
دوستان عزیز ما اینجا نمی خوایم paint درست کنیم چون اگر هم درست بشه نه کسی ازش استفاده می کنه (تو یه ربع میشه یه paint با #C نوشت) و نه قابلیت هایی رو که ما می خوایم می تونه داشته باشه
ولی خوب .... همین که ذهن انسان بتونه همچین فکر هایی رو هم اجرا کنه خودش جای خوشحالی داره.
اگر از دوستان کسی دوست داشت کمک کنن ( خدارو چه دیدی، شاید یه زمانی همین یه اسمی ،پروژه ای برای خودش پا کرد)

H:Shojaei
جمعه 30 دی 1390, 16:58 عصر
سلام من منطق برنامه نویسیم خوبه حیف که کار با توابع رو بلد نیستم
یعنی خود توابع رو نمیدونم فقط لطف کنید بگید توابع مربوط به عملکردهای موس(تو php) چیه
باقیش با من

H:Shojaei
جمعه 30 دی 1390, 16:59 عصر
سلام من منطق برنامه نویسیم خوبه حیف که کار با توابع رو بلد نیستم
یعنی خود توابع رو نمیدونم فقط لطف کنید بگید توابع مربوط به عملکردهای موس(تو php) چیه
باقیش با من

ravand
جمعه 30 دی 1390, 17:23 عصر
من توي اينترنت گشتم و اينا رو پيدا كردم:
http://blog.webagesolutions.com/archives/135
توي اين آدرس يك تابع در اين مورد معرفي كرده :
http://www.openstudio.fr/Library-for-simple-drawing-with.html?lang=fr
اين كد زير رو حتما امتحان كنيد يك كد جاوا اسكريپت هست كه ميشه باهاش خط كشيد . :لبخند:

<!DOCTYPE html>
<html>
<head>
<title>Canvas Test</title>
<script type="text/javascript">
var x = 0;
var y = 0;
function init() {
var canvas = document.getElementById('canvas');
canvas.addEventListener("mousedown", drawLine, false);
}
function toCanvasX(c, e) {
var posx = 0;
if (e.pageX) {
posx = e.pageX;
} else if (e.clientX) {
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
}
posx = posx - c.offsetLeft;
return posx;
}
function toCanvasY(c, e) {
var posy = 0;
if (e.pageY) {
posy = e.pageY;
} else if (e.clientY) {
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
posy = posy - c.offsetTop;

return posy;
}
function drawLine(e) {
var posx = toCanvasX(this, e);
var posy = toCanvasY(this, e);
var ctx= this.getContext('2d');
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(posx, posy);
ctx.stroke();

x = posx;
y = posy;
}
</script>
</head>
<body onload="init();">
<canvas id="canvas" width="500" height="500" style="border: 1px dotted;">
This text is displayed if your browser does not support HTML5 Canvas.
</canvas>
</body>
</html>
بچه ها دست بكار شيد يه كاري بكنيم.:لبخند:

djsaeedkhan
جمعه 30 دی 1390, 17:53 عصر
سلام
قراره با php درست کنیم یا با جاوا اسکریپت؟

ravand
جمعه 30 دی 1390, 17:58 عصر
راستش دادا.
فكرام رو كردم از يه طرف ديدم حق با آقاي شهركيه.
اگه با يه برنامه ي سمت كلاينت كار كنيم راحت تريم.
ولي هنوزم از php نااميد نشدم :لبخند:
هم با جاوا اسكريپت و جي كوئري كار ميكنيم و هم با php
ما مي توانيم :لبخند:

MMSHFE
جمعه 30 دی 1390, 18:58 عصر
ببینید دوستان، در اینکه باید از جاوا اسکریپت استفاده کنیم هیچ بحثی نیست چون رویدادهای سمت کاربر (مثل کلیک کردن و فشاردادن کلید خاص و...) رو با هیچ زبان سمت سروری نمیشه دریافت کرد و این ربطی به PHP یا ASP.NET و... نداره. اما بحث پردازشهای سمت سرورش فرق میکنه. میتونیم همه کارها رو با JS انجام بدیم یا اینکه فقط رویدادها رو با JS بگیریم و بفرستیم برای PHP و اون بر اساس رویدادها، تصویر رو تغییر بده و نسخه بازسازی شده رو بفرسته برای کاربر و کاربر اون رو مشاهده کنه. اینجا اصلاً موضوع راحت تر بودن نیست، موضوع عدم امکان استفاده از زبان سمت سرور برای دریافت اطلاعات کاربر هست و این دیگه اسمش محدودیت نیست چون اصلاً این زبانها برای این کار طراحی نشدن. اون مثالی هم که جناب ravand گذاشتن (VB) مربوط به برنامه نویسی دسکتاپ هست که قبلاً گفتم هیچ ارتباطی به موضوع بحثمون نداره. موفق باشید.

ravand
جمعه 30 دی 1390, 20:05 عصر
بله حق با شماست . فكر ميكنم اون سايتي هم كه مثال زدم امده كارهاي سمت كلاينت مثل كليك رو با جي كوئري يا جاوا اسكريت انجام داده و كارهاي سمت سرور رو با php يا asp.

djsaeedkhan
سه شنبه 04 بهمن 1390, 18:37 عصر
با سلام خدمت دوستان
این هم یه نقاش کوچولو با php
فقط وقتی نقاشیتون تموم شد ببینید با چند تا کلیک نقاشی کردید.

دوستانی که دانلود می کنن تشکر فراموششون نشه
با تشکر
81377

djsaeedkhan
سه شنبه 04 بهمن 1390, 18:39 عصر
دوستان می تونن نقاشی هاشون رو هم اینجا بزارن
فقط حواستون باشه یبار فتوشاپی نشه عکستون:قهقهه::چشمک:

tux-world
چهارشنبه 05 بهمن 1390, 08:58 صبح
خالي از لطف نيست : http://raphaeljs.com/ball.html

ravand
چهارشنبه 05 بهمن 1390, 17:55 عصر
الان اين سايتي كه شما داديد كارش چيه؟

yones_safari
چهارشنبه 05 بهمن 1390, 18:58 عصر
الان اين سايتي كه شما داديد كارش چيه؟
عزیز با استفاده از جاوا اسکریپت این شکل رو ساخته.
من نمیدونم واسه یه کار ساده سمت کاربر چرا باید 4 صفحه جواب گذاشته بشه!!!!!
خودشم تو بخش PHP!!!!!!!!!!!!!!!!!!!!!!!

ravand
چهارشنبه 05 بهمن 1390, 19:53 عصر
منم ميدونم داداش
ولي برام عجيبه كه اين چه ربطي به سوال ما داره!

yones_safari
چهارشنبه 05 بهمن 1390, 20:25 عصر
منم ميدونم داداش
ولي برام عجيبه كه اين چه ربطي به سوال ما داره!
با انگشتت خط نمیکشی که با توابع میکشی.نمونه هستش.:لبخند:شوخی:چشمک: